#!/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 發表