#!/bin/sh
#(c) Copyright Barry Kauler 2007
#Now LGPL 2007
#run like this: # new2dir make install
#creates a directory one or two levels higher with the name of the package
#but slightly modified. For example source package has dir 'abiword-0.5.6'
#inside this you do the usual 'configure', 'make', then 'new2dir make install'
#and 'abiword-0.5.6-i486' directory gets created, with all installed files
#in it.

if [ ! $1 ];then
 echo "このスクリプトはソースまたはバイナリパッケージをインストール"
 echo "する時の最終ステップで使われます。例えば:"
 echo "# new2dirjp make install"
 echo "スクリプトを終了します。"
 exit
fi

CURRDIR="`pwd`"
UPONE="`dirname "$CURRDIR"`"
PKGDIR="../`basename "$CURRDIR"`"
xPKGDIR="`basename "$CURRDIR"`"
if [ "`echo "$PKGDIR" | grep '[0-9]'`" = "" ];then
 PKGDIR="../../`basename "$UPONE"`"
 xPKGDIR="`basename "$UPONE"`"
fi
if [ "`echo "$PKGDIR" | grep '[0-9]'`" = "" ];then
 echo "$PKGDIR はバージョン番号付きのパッケージディレクトリではないようです"
 echo "残念ながらいくつかのソースパッケージTAR書庫を展開するディレクトリ名に"
 echo "バージョン番号がありません。SeaMonkeyがこの例です。これは"
 echo "単に「mozilla」という名前が付けられたディレクトリに展開します。"
 echo "このスクリプトはディレクトリと同じ名前でパッケージを作成します。そして"
 echo "それは必ずアラビア数字で始まるバージョン番号を持たなければなりません。"
 echo "ここでurxvt端末ウィンドウを閉じてディレクトリをリネームしなければ"
 echo "なりません。例えば、SeaMonkey version 1.0.7 の場合"
 echo "ディレクトリを 'mozilla' から 'seamonkey-1.0.7' にリネームします。"
 echo "ダッシュ '-' を使ってパッケージ名とバージョンを分けなければいけません。"
 echo " 'seamonkey-alpha1' というディレクトリ名は使えません。バージョン番号は"
 echo "アラビア数字で始まらなければいけません。例：'seamonkey-1.0.7alpha1'"
 echo "スクリプトを終了します。"
 exit
fi

fixfilelistfunc() {
 #$1 is file to remove, as doesn't exist.
 echo " ...${1} は削除されました。"
 grep -v "$1" /tmp/${EXE_PKGNAME}.files > /tmp/${EXE_PKGNAME}.files.tmp
 mv -f /tmp/${EXE_PKGNAME}.files.tmp /tmp/${EXE_PKGNAME}.files
}

echo
echo -en "\\033[1;31mステップ 1" #red
echo -e "\\033[0;39m"
echo "パッケージディレクトリは '$PKGDIR' のようです"
echo "これで良ければENTERキーを押して下さい。"
echo "違っていれば相対アドレスで正しいディレクトリを入力して下さい。"
echo " 注意:"
echo " このスクリプトはディレクトリと同じ名前でパッケージを作成します。そして"
echo " 必ずアラビア数字で始まるバージョン番号が付いていなければいけません。"
echo " さらに名前とバージョン番号はダッシュ '-' で分けられていなければ"
echo " いけません。例、 'seamonkey-1.0.7' "
echo " 'seamonkey-alpha1' のようなディレクトリ名は使えません。バージョン番号は"
echo " アラビア数字で始まらなければなりません。例、 'seamonkey-1.0.7alpha1' "
echo " $PKGDIR が正しくなければ、ここでCTRL-Cで終了してこのurxvt端末"
echo " ウィンドウを閉じてからディレクトリをリネームしなければなりません。"
echo -n "ここに答えを入力して下さい: "
read REPLY1
[ ! "$REPLY1" = "" ] && PKGDIR="$REPLY1"
if [ ! -d "$PKGDIR" ];then
 echo
 echo "$PKGDIR は存在しません。スクリプトを終了します。"
 exit
fi
echo "オーケー、$PKGDIR を使います"

echo
echo -en "\\033[1;31mステップ 2" #red
echo -e "\\033[0;39m"
echo "パピーは i486 CPU 以上で動くように作られています。通常これは"
echo " 'build=i486-t2-linux-gnu' (ある時は host=) と明記しなければ"
echo "いけない事を意味します。若干のパッケージは構成オプションがありません。"
echo "PCに何があるか気にせずに特定のCPU用にコンパイルします。"
echo "i486用にコンパイルしたならば、ENTERキーを押して下さい。"
echo "さもなければ、CPUのタイプを入力して下さい。例: i386 i486 i686 (i は必要です)"
echo -n "ここに答えを入力して下さい: "
read CPUTYPE
[ "$CPUTYPE" = "" ] && CPUTYPE="i486"
if [ "`echo -n "$CPUTYPE" | grep '^[a-zA-Z]'`" = "" ];then
 echo "$CPUTYPE は無効です。終了します。"
 exit
fi
echo "オーケー。 $CPUTYPE を使います。"

#would like to create different targets for exe, doc, dev, nls components...
EXE_TARGETDIR="${PKGDIR}-${CPUTYPE}" #relative path.
EXE_PKGNAME="`basename $EXE_TARGETDIR`"
RELPATH="`dirname $EXE_TARGETDIR`"
#difficult task, separate package name from version part... 
#not perfect, some start with non-numeric version info...
xNAMEONLY="`echo -n "$xPKGDIR" | sed -e 's/\-[0-9].*$//g'`"
#...if that fails, do it the old way...
[ "$xNAMEONLY" = "$xPKGDIR" ] && xNAMEONLY="`echo "$xPKGDIR" | cut -f 1 -d "-"`"
NAMEONLY="${RELPATH}/${xNAMEONLY}"
#abasename="`basename ${PKGDIR}`"
apattern="s/${xNAMEONLY}\\-//g"
VERONLY="`echo -n "$xPKGDIR" | sed -e "$apattern"`"
DOC_TARGETDIR="${NAMEONLY}_DOC-${VERONLY}-${CPUTYPE}"
DOC_PKGNAME="`basename $DOC_TARGETDIR`"
DEV_TARGETDIR="${NAMEONLY}_DEV-${VERONLY}-${CPUTYPE}"
DEV_PKGNAME="`basename $DEV_TARGETDIR`"
NLS_TARGETDIR="${NAMEONLY}_NLS-${VERONLY}-${CPUTYPE}"
NLS_PKGNAME="`basename $NLS_TARGETDIR`"

rm -rf "$EXE_TARGETDIR" 2>/dev/null
rm -rf "$DOC_TARGETDIR" 2>/dev/null
rm -rf "$DEV_TARGETDIR" 2>/dev/null
rm -rf "$NLS_TARGETDIR" 2>/dev/null

echo
echo -en "\\033[1;31mステップ 3" #red
echo -e "\\033[0;39m"
echo "もし望むならば、最終的なパッケージを'executables'、'documentation'"
echo "'development'、'international'コンポーネント用に"
echo "別々のパッケージに分ける事ができます。"
echo "パッケージが共有ライブラリを持っているならば、少なくとも分離した"
echo " 'development' パッケージを作成する事が推奨されます。ここでの"
echo "考えは'executables' PETパッケージは絶対必要なものだけにして"
echo "できる限り「脂肪を取り除く」事です。しかし必要ならば"
echo "追加コンポーネントをインストールする事ができます。"
echo "警告: このスクリプトで実行される自動スプリットは完全でないかも知れません。"
echo "         そしてPETパッケージに変換する最終的なステップの前に"
echo "         作成された別々のディレクトリの内容を"
echo "         修正しなければならないかも知れません。"
echo
echo "１つのパッケージだけを作成するにはENTERキーを押して下さい。"
echo "あるいは、分けたパッケージのどれを作成するか選択して番号を入力して下さい:"
echo " 1 一つのパッケージ(ディレクトリ)だけ"
echo " 2 別に 'development' パッケージを作成"
echo " 3 別に 'development'、'documentation'、'international' パッケージを作成"
echo "あるいは作成したい別々のパッケージのカンマ区切りリストを入力"
echo " キーワード 'exe'、'dev'、'doc'、'nls' が使えます。"
echo " 例: exe,dev,doc  (この例では nls コンポーネントがメインパッケージに"
echo " 残されます。それは、実行exeコンポーネントです)"
echo -n "答えを入力して下さい (不確かならENTERキーを押して下さい): "
read SPLITPETS
[ "$SPLITPETS" = "" ] && SPLITPETS="exe"
[ "$SPLITPETS" = "1" ] && SPLITPETS="exe"
[ "$SPLITPETS" = "2" ] && SPLITPETS="exe,dev"
[ "$SPLITPETS" = "3" ] && SPLITPETS="exe,dev,doc,nls"
EXESPLIT="";DOCSPLIT="";DEVSPLIT="";NLSSPLIT=""
[ ! "`echo "$SPLITPETS" | grep 'exe'`" = "" ] && EXESPLIT="yes"
[ ! "`echo "$SPLITPETS" | grep 'doc'`" = "" ] && DOCSPLIT="yes"
[ ! "`echo "$SPLITPETS" | grep 'dev'`" = "" ] && DEVSPLIT="yes"
[ ! "`echo "$SPLITPETS" | grep 'nls'`" = "" ] && NLSSPLIT="yes"


[ ! "`echo "$SPLITPETS" | grep 'exe'`" = "" ] && mkdir "$EXE_TARGETDIR"
#[ ! "`echo "$SPLITPETS" | grep 'doc'`" = "" ] && mkdir "$DOC_TARGETDIR"
#[ ! "`echo "$SPLITPETS" | grep 'dev'`" = "" ] && mkdir "$DEV_TARGETDIR"
#[ ! "`echo "$SPLITPETS" | grep 'nls'`" = "" ] && mkdir "$NLS_TARGETDIR"

echo
echo -en "\\033[1;31mステップ 4" #red
echo -e "\\033[0;39m"
echo "以下の行が実行されようとしています:"
echo "# installwatch -o /tmp/pkginstall.list ${@}"
echo "...これは全てのファイルの活動を/tmp/pkginstall.listに記録します"
echo "それからこのスクリプトは全ての新しく作成されたディレクトリとファイルを"
echo "決定して、新しいファイルで '$EXE_TARGETDIR' を作成します。"
echo "(任意で ${DEV_TARGETDIR}、 ${DOC_TARGETDIR}、 ${NLS_TARGETDIR})"
echo -n "続けるにはENTERキーを押して下さい: "
read goforit

installwatch -o /tmp/pkginstall.list ${@}

sync
#create list of installed files...
#v2.17 bug, if sometimes logs files in the pkg installing from, have added
# filter out $UPONE...
# BUGPATTERN='&'"$UPONE"
# no, just filter out /mnt and /initrd...
cat /tmp/pkginstall.list | grep '#success$' | tr -s '\t' | tr '&' ' ' | tr '\t' '&' | grep '^[345]&open&' | grep --extended-regexp -v '&/dev/tty&|&/dev/null&|&/root/\.packages/|&/tmp/|&/root/\.icewm/|&/proc/|&/sys/|DotPupTmpDir|/\.myownmenuerc' | grep -E -v '&/initrd|&/mnt/' | cut -f 3 -d '&' > ${RELPATH}/${EXE_PKGNAME}.files
#...list will only have created files, not created directories, so an empty
#   directory won't get recorded.

#bad if we miss out installing an empty directory...
cat /tmp/pkginstall.list | grep '#success$' | tr -s '\t' | tr '&' ' ' | tr '\t' '&' | grep '^0&mkdir&' | grep --extended-regexp -v '&/dev/tty&|&/dev/null&|&/root/\.packages/|&/tmp/|&/root/\.icewm/|&/proc/|&/sys/|DotPupTmpDir|/\.myownmenuerc' | grep -E -v '&/initrd|&/mnt/' | cut -f 3 -d '&' | sed -e 's/^\/\//\//g' > /tmp/${EXE_PKGNAME}.dirs

sync
#pick up created symlinks...
cat /tmp/pkginstall.list | grep '#success$' | tr -s '\t' | tr '&' ' ' | tr '\t' '&' | grep '^0&symlink&' | grep --extended-regexp -v '&/dev/tty&|&/dev/null&|&/root/\.packages/|&/tmp/|&/root/\.icewm/|&/proc/|&/sys/|DotPupTmpDir|/\.myownmenuerc' | grep -E -v '&/initrd|&/mnt/' | cut -f 4 -d '&' >> ${RELPATH}/${EXE_PKGNAME}.files

sync
#problem if there is a post-install script that moves or renames a file...
cat /tmp/pkginstall.list | grep '#success$' | tr -s '\t' | tr '&' ' ' | tr '\t' '&' | grep '^0&rename&' | grep --extended-regexp -v '&/dev/tty&|&/dev/null&|&/root/\.packages/|&/tmp/|&/root/\.icewm/|&/proc/|&/sys/|DotPupTmpDir|/\.myownmenuerc' | grep -E -v '&/initrd|&/mnt/' | cut -f 3,4 -d '&' | tr '\n' ' ' > /tmp/${EXE_PKGNAME}.moved.files
#find out if any installed file got moved/renamed...
if [ -s /tmp/${EXE_PKGNAME}.moved.files ];then
 for ONEMOVED in `cat /tmp/${EXE_PKGNAME}.moved.files`
 do
  ONEORIG="`echo -n "$ONEMOVED" | cut -f 1 -d '&'`"
  ONENEW="`echo -n "$ONEMOVED" | cut -f 2 -d '&'`"
  grep -v "$ONEORIG" ${RELPATH}/${EXE_PKGNAME}.files > /tmp/${EXE_PKGNAME}.files
  echo "$ONENEW" >> /tmp/${EXE_PKGNAME}.files
  sync
  mv -f /tmp/${EXE_PKGNAME}.files ${RELPATH}/${EXE_PKGNAME}.files
 done
fi


sync
echo
echo -en "\\033[1;31mステップ 5" #red
echo -e "\\033[0;39m"
#fixfilelistfunc() uses this...
cp -af ${RELPATH}/${EXE_PKGNAME}.files /tmp/${EXE_PKGNAME}.files
#...a post-install script could delete files, which fixfilelistfunc fixes.
cat ${RELPATH}/${EXE_PKGNAME}.files |
while read ONEFILE
do
 ONEBASE="`basename "$ONEFILE"`"
 ONEPATH="`dirname "$ONEFILE"`"
 echo " ${ONEFILE} を処理中"

 #strip the file...
 if [ ! -h "$ONEFILE" ];then #make sure it isn't a symlink
  [ ! "`file "$ONEFILE" | grep 'ELF' | grep 'shared object'`" = "" ] && strip --strip-debug "$ONEFILE"
  [ ! "`file "$ONEFILE" | grep 'ELF' | grep 'executable'`" = "" ] && strip --strip-unneeded "$ONEFILE"
 fi
 sync

 if [ "$NLSSPLIT" = "yes" ];then
  #find out if this is an international language file...
  if [ ! "`echo -n "$ONEFILE" | grep --extended-regexp '/locale/|/nls/|/i18n/'`" = "" ];then
   mkdir -p "${NLS_TARGETDIR}/${ONEPATH}"
   cp -af "$ONEFILE" "${NLS_TARGETDIR}/${ONEPATH}/" 2>/dev/null
   [ $? -ne 0 ] && fixfilelistfunc $ONEFILE
   continue
  fi
 fi

 if [ "$DOCSPLIT" = "yes" ];then
  #find out if this is a documentation file...
  if [ ! "`echo -n "$ONEFILE" | grep --extended-regexp '/man/|/doc/|/docs/|/info/|/gtk-doc/|/faq/|/manual/|/examples/|/help/|/htdocs/'`" = "" ];then
   mkdir -p "${DOC_TARGETDIR}/${ONEPATH}"
   cp -af "$ONEFILE" "${DOC_TARGETDIR}/${ONEPATH}/" 2>/dev/null
   [ $? -ne 0 ] && fixfilelistfunc $ONEFILE
   continue
  fi
 fi

 if [ "$DEVSPLIT" = "yes" ];then
  #find out if this is development file...
  if [ ! "`echo -n "$ONEFILE" | grep --extended-regexp '/include/|/pkgconfig/|/aclocal|/cvs/|/svn/'`" = "" ];then
   mkdir -p "${DEV_TARGETDIR}/${ONEPATH}"
   cp -af "$ONEFILE" "${DEV_TARGETDIR}/${ONEPATH}/" 2>/dev/null
   [ $? -ne 0 ] && fixfilelistfunc $ONEFILE
   continue
  fi
  #find *.so symlink files...
  if [ -h "$ONEFILE" ];then #-h tests for symlink
   if [ ! "`echo -n "$ONEFILE" | grep '\.so$'`" = "" ];then
    mkdir -p "${DEV_TARGETDIR}/${ONEPATH}"
    cp -af "$ONEFILE" "${DEV_TARGETDIR}/${ONEPATH}/" 2>/dev/null
    [ $? -ne 0 ] && fixfilelistfunc $ONEFILE
    continue
   fi
  fi
  #find various config files...
  if [ ! "`echo -n "$ONEBASE" | grep --extended-regexp '\-config$|config.sh$|Conf.sh$'`" = "" ];then
    mkdir -p "${DEV_TARGETDIR}/${ONEPATH}"
    cp -af "$ONEFILE" "${DEV_TARGETDIR}/${ONEPATH}/" 2>/dev/null
    [ $? -ne 0 ] && fixfilelistfunc $ONEFILE
    continue
  fi
  #all .a and .la files... and any stray .m4 files...
  if [ ! "`echo -n "$ONEBASE" | grep --extended-regexp '\.a$|\.la$|\.m4$'`" = "" ];then
    mkdir -p "${DEV_TARGETDIR}/${ONEPATH}"
    cp -af "$ONEFILE" "${DEV_TARGETDIR}/${ONEPATH}/" 2>/dev/null
    [ $? -ne 0 ] && fixfilelistfunc $ONEFILE
    continue
  fi  
 fi

 #anything left over goes into the main 'executable' package...
 if [ "$EXESPLIT" = "yes" ];then
  mkdir -p "${EXE_TARGETDIR}/${ONEPATH}"
  cp -af "$ONEFILE" "${EXE_TARGETDIR}/${ONEPATH}/" 2>/dev/null
  [ $? -ne 0 ] && fixfilelistfunc $ONEFILE
  #fix for empty directories...
  cat /tmp/${EXE_PKGNAME}.dirs |
  while read ANEWDIR
  do
   [ "`ls -1 $ANEWDIR`" = "" ] && mkdir -p ${EXE_TARGETDIR}${ANEWDIR}
  done
 fi
done
sync
cp -af /tmp/${EXE_PKGNAME}.files ${RELPATH}/${EXE_PKGNAME}.files

echo
echo -en "\\033[1;31mFinished" #red
echo -e "\\033[0;39m"
echo "$EXE_TARGETDIR は現在完全に実装されています。"
[ -d "$DEV_TARGETDIR" ] && echo "$DEV_TARGETDIR も実装されています。"
[ -d "$DOC_TARGETDIR" ] && echo "$DOC_TARGETDIR も実装されています。"
[ -d "$NLS_TARGETDIR" ] && echo "$NLS_TARGETDIR も実装されています。"
echo "${RELPATH}/${EXE_PKGNAME}.files にはインストール済ファイルの一覧があります。"
echo "そのディレクトリ内の脂肪やその他何でも取り除きたいかも知れません。"
echo "しかし基本的に現在PETパッケージに変換する準備ができています。"
echo "次のようにして下さい:"
echo "# cd ${RELPATH}"
echo "# dir2petjp $EXE_PKGNAME"

echo
echo "このスクリプトを終了するだけならENTERキーを押して下さい。"
echo "あるいは便利を望むなら 'dir2petjp' スクリプトをすぐに開始する事が"
echo "できます -- キーボードの好きな文字を押してからENTERキーを押して下さい。"
echo -n "ここに答えを入力して下さい: "
read nextphase
[ "$nextphase" = "" ] && exit

cd ${RELPATH}
if [ -d ${xNAMEONLY}-${VERONLY}-${CPUTYPE} ];then
 dir2petjp ${xNAMEONLY}-${VERONLY}-${CPUTYPE}
 echo -n "${xNAMEONLY}-${VERONLY}-${CPUTYPE}.pet を作成しました。続けるにはENTERキーを押して下さい: "
 read domore
fi

if [ -d ${xNAMEONLY}_DEV-${VERONLY}-${CPUTYPE} ];then
 dir2petjp ${xNAMEONLY}_DEV-${VERONLY}-${CPUTYPE}
 echo -n "${xNAMEONLY}_DEV-${VERONLY}-${CPUTYPE}.pet を作成しました。続けるにはENTERキーを押して下さい: "
 read domore
fi

if [ -d ${xNAMEONLY}_DOC-${VERONLY}-${CPUTYPE} ];then
 dir2petjp ${xNAMEONLY}_DOC-${VERONLY}-${CPUTYPE}
 echo -n "${xNAMEONLY}_DOC-${VERONLY}-${CPUTYPE}.pet を作成しました。続けるにはENTERキーを押して下さい: "
 read domore
fi

if [ -d ${xNAMEONLY}_NLS-${VERONLY}-${CPUTYPE} ];then
 dir2petjp ${xNAMEONLY}_NLS-${VERONLY}-${CPUTYPE}
 echo -n "${xNAMEONLY}_NLS-${VERONLY}-${CPUTYPE}.pet を作成しました。続けるにはENTERキーを押して下さい: "
 read domore
fi

echo "全て終了。"

###END###
