回精華區
作者tsaikd.bbs@tsaikd.twbbs.org (千人斬) 看板: plan
標題Re: [程式] script 快速的跟 ITOC BBS 的公版同步更新
時間地下惡魔城 (2005/06/11 Sat 12:37:41)
#!/bin/bash
# ========================================================================
# 程式目的:
#     讓 BBS Code 管理者可以快速的跟 ITOC BBS 的公版同步更新
#
# 程式需求:
#     bash      >= 3.0-r11  ( for shell )
#     wget      >= 1.9.1-r5 ( for wget )
#     grep      >= 2.5.1-r7 ( for grep )
#     gawk      >= 3.1.3-r2 ( for awk )
#     patch     >= 2.5.9    ( for patch )
#     diffutils >= 2.8.7-r1 ( for diff )
#     coreutils >= 5.2.1-r6 ( for basename mkdir head tail cat cut ls cp mv rm)
#
# 使用說明:
#     01. 請先將本 script 的權限更改為可執行:
#           chmod 700 merge_itoc_bbs.sh
#     02. 在使用本 script 之前
#         請先確定 ~bbs/tmp/ 中有兩個以上的 ITOC BBS 的 sources
#         一個是新的,一個是舊的
#         本 script 只會檢查最新的兩個 sources code
#         而且其資料需放在 ~bbs/tmp/bbs_XXXXXXXX ( XXXXXXXX 為版本日期 )
#         ( 建議先執行本 script 的姐妹作 get_itoc_bbs.sh 以確定格式相容 )
# ========================================================================
# 版權宣告:
#     本程式為免費軟體
#     歡迎以任何形式散佈
#     請勿做商業行為
# 寫作環境:
#     Gentoo Linux
#     Kernel 2.6.10-gentoo-r6
# 臭蟲回報:
#     tsaikd <tsaikd@gmail.com>
# 歷史紀錄:
#     2005/06/01 tsaikd         首次釋出
#     2005/06/07 tsaikd         修正一些造成空字串的 bug
#     2005/06/08 tsaikd         新增必要程式自我檢測機制
#     2005/06/10 tsaikd         增加一些人性化的控制,防止二度更新
# ========================================================================
#                               程式自我檢測
# ========================================================================
PROGRAM_LIST="bash grep awk patch diff basename mkdir head tail cat cut ls cp mv rm"
for i in $PROGRAM_LIST ; do
  if [ -z "$(type -p $i)" ] ; then
    echo "[ERROR] Can't find $i in your system"
    exit 1
  fi
done
# ========================================================================
#                                  設定區
# ========================================================================
START_LINE="vvvvvvvvvvvvvvvvvvvvv==== start ====vvvvvvvvvvvvvvvvvvvvvvvvv"
  END_LINE="^^^^^^^^^^^^^^^^^^^^^====  end  ====^^^^^^^^^^^^^^^^^^^^^^^^^"
# ========================================================================
#                                 程式開始
# ========================================================================

cd
HOME="$(pwd)"
[ ! -d "${HOME}/tmp" ] && mkdir "${HOME}/tmp"
cd "${HOME}/tmp"

FILE_LIST="$(ls -dr bbs_*)"
declare -i NUM=0
unset NEW_BBS
unset OLD_BBS
for i in $FILE_LIST ; do
  ((NUM++))
  if [ "$NUM" -eq 1 ] ; then
    NEW_BBS="$i"
  elif [ "$NUM" -eq 2 ] ; then
    OLD_BBS="$i"
  else
    break
  fi
done

if [ -z "$NEW_BBS" ] || [ -z "$OLD_BBS" ] ; then
  echo "[ERROR] Cannot find more than one BBS source directory!"
  exit 1
fi

diff -ruN "$OLD_BBS" "$NEW_BBS" | grep diff > merge_bbs.list.tmp

BUF="$(tail -n 1 merge_bbs.list.tmp)"
while [ -n "$BUF" ] ; do
  if [ -n "$(echo "$BUF" | grep -E "^Files .* and .* differ$")" ] ; then
    MERGE_FILE="$(echo "$BUF" | awk '{print $2}' | cut -c 13-)"
    MERGE_FILE_NAME="$(basename "$MERGE_FILE")"
    OLD_BBS_FILE="${HOME}/tmp/${OLD_BBS}${MERGE_FILE}"
    NEW_BBS_FILE="${HOME}/tmp/${NEW_BBS}${MERGE_FILE}"
    SRC_BBS_FILE="${HOME}${MERGE_FILE}"

    echo "$BUF"
    printf "Do you want to update the file ? [y/n] " ; read ANS
    cp -f "$NEW_BBS_FILE" "$SRC_BBS_FILE"
  else
    MERGE_FILE="$(echo "$BUF" | awk '{print $3}' | cut -c 13-)"
    MERGE_FILE_NAME="$(basename "$MERGE_FILE")"
    OLD_BBS_FILE="${HOME}/tmp/${OLD_BBS}${MERGE_FILE}"
    NEW_BBS_FILE="${HOME}/tmp/${NEW_BBS}${MERGE_FILE}"
    SRC_BBS_FILE="${HOME}${MERGE_FILE}"

    if [ -z "$(diff -ruN "$SRC_BBS_FILE" "$NEW_BBS_FILE")" ] ; then
      echo
      echo "$SRC_BBS_FILE is updated!"
    elif [ -z "$($BUF > merge_bbs.patch.tmp ; \
                 cp -f "$SRC_BBS_FILE" "$MERGE_FILE_NAME" ; \
                 patch "$MERGE_FILE_NAME" merge_bbs.patch.tmp &>/dev/null ; \
                 diff -ruN "$SRC_BBS_FILE" "$NEW_BBS_FILE")" ] ; then
      echo
      echo "$SRC_BBS_FILE is updated!"
    else
      $BUF > merge_bbs.patch.tmp
      cp -f "$SRC_BBS_FILE" "$MERGE_FILE_NAME"

      echo
      echo "Between \"$OLD_BBS_FILE\" \"$NEW_BBS_FILE\""
      printf "Do you want to read patch contents ? [y/n] " ; read ANS
      if [ "$ANS" == "y" ] ; then
        echo "$START_LINE"
        cat merge_bbs.patch.tmp
        echo "$END_LINE"
      fi

      echo
      printf "Do you want to merge it automatically ? [y/n] " ; read ANS
      if [ "$ANS" == "y" ] ; then
        patch "$MERGE_FILE_NAME" merge_bbs.patch.tmp
        if [ "$?" -ne 0 ] ; then
          echo "[ERROR] when merge $MERGE_FILE_NAME"
          echo "Press 'Enter' to continue ..." ; read
        fi

        echo
        echo "Between \"$NEW_BBS_FILE\" \"merged $MERGE_FILE_NAME\""
        if [ -z "$(diff -ruN "$NEW_BBS_FILE" "$MERGE_FILE_NAME")" ] ; then
          echo "They are the same files. And update it automatically!"
          mv -f "$MERGE_FILE_NAME" "$SRC_BBS_FILE"
        else
          printf "Do you want to read the differences ? [y/n] " ; read ANS
          if [ "$ANS" == "y" ] ; then
            echo "$START_LINE"
            diff -ruN "$NEW_BBS_FILE" "$MERGE_FILE_NAME"
            echo "$END_LINE"
          fi

          echo
          echo "After merging \"$SRC_BBS_FILE\","
          printf "Do you want to update it automatically ? [y/n] " ; read ANS
          if [ "$ANS" == "y" ] ; then
            mv -f "$MERGE_FILE_NAME" "$SRC_BBS_FILE"
          else
            echo "$MERGE_FILE_NAME is keeping in ~/tmp"
          fi
        fi
      fi
    fi
  fi
  head -n -1 merge_bbs.list.tmp > merge_bbs.list.tmp2
  mv -f merge_bbs.list.tmp2 merge_bbs.list.tmp
  BUF="$(tail -n 1 merge_bbs.list.tmp)"
done

rm -f merge_bbs.patch.tmp
rm -f merge_bbs.list.tmp

echo
echo "**** == Remember to compile your BBS again !! == ****"
echo

# ========================================================================
#                                 程式結束
# ========================================================================


--
 千        人         斬    KD !! 地下惡魔城 telnet://bbs.tsaikd.twbbs.org
 K Delete         殺殺殺 殺到你脫褲子 "放屁" !!
 i    ~~      ▄▃▂▁       ︿◎    ︿◎    ︿◎ 快逃啊!!
 l    ~~ ◤ ̄ ̄                  ◤﹀    ◤﹀    ◤﹀
 o   ~ /∣                  ..﹀〉....﹀〉....﹀〉

--
  Origin:  成大資訊˙地下惡魔城  tsaikd.twbbs.org 
  Author: tsaikd tsaikd.v1.dorm.ncku.edu.tw 發表
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻