#!/bin/sh

#convert a .pup file to .pet...
#passed param is file to be converted.
#this works for md5sum returning 8-bit characters!

#note, this script does not really convert a DotPup package into a PET package.
#The .pup is just placed inside a directory and the directory is made into a
#tarball then into a .pet file. The PETget package manager will recognise
#this and will launch the DotPup package installer.
#However, there is some enhanced capability, for example if the
#.pup does not register in /root/.packages/ then PETget will do it.

sync
[ ! $1 ] && exit
APUP=$1
MYPID=${$}
CURRDIR="`pwd`"

#only accept .pup files...
[ "`echo -n "$APUP" | grep '\\.pup$'`" = "" ] && exit 1
[ ! -f "$APUP" ] && exit 1

chmod +w "$APUP" #make it writable.

#split APUP path/filename into components...
BASEPKG="`basename $APUP .pup`"
DIRPKG="`dirname $APUP`"
[ "$DIRPKG" = "/" ] && DIRPKG=""

[ -e $DIRPKG/$BASEPKG ] && exit 1

. /etc/xdg/menus/hierarchy #has PUPHIERARCHY variable.

#find out what are official Unleashed packages...
#cat /root/.packages/

#want to find out if dotpup has a .desktop file inside...
#awkward, as .tar.bz2 files inside .zip file... have to unzip it...
#mkdir /tmp/tmp${MYPID}
#cp -a "$APUP" /tmp/tmp${MYPID}/
#unzip /tmp/tmp${MYPID}/${BASEPKG}.pup
#DESKTOPFILE="`find /tmp/tmp${MYPID} -type f -name \*.desktop`"
#if [ "$DESKTOPFILE" = "" ];then
# if [ -f FILESYSTEM.tbz ];then
#  DESKTOPFILE="`tar --list -f FILESYSTEM.tbz | grep '\.desktop$'`"
# fi
#fi
#if [ "$DESKTOPFILE" = "" ];then
# #see if can find icon, 
#fi

#if dotpup already has .desktop file, use it ...reluctantly, as looking at some,
#they are wrong: menu icon not 16x16, wrong executable
DESKTOPFILE=""
[ ! "`unzip -l "$APUP" | grep 'FILESYSTEM\.tbz'`" = "" ] && DESKTOPFILE="maybe"
[ ! "`unzip -l "$APUP" | grep '\.desktop$'`" = "" ] && DESKTOPFILE="yes"

echo
echo "このスクリプトは ${BASEPKG}.pup を ${BASEPKG}.pet に変換します"
echo
echo "アプリケーション ${BASEPKG} のメニューエントリが不用とわかっているなら"
echo "ここで「no」と入力して下さい。メニューエントリが必要なら"
echo "ただENTERキーだけ押して下さい。"
echo -n "「no」とタイプするかENTERキーだけ押す: "
read NOMENU
[ ! "$NOMENU" = "" ] && DESKTOPFILE="ignore"

if [ "$DESKTOPFILE" = "maybe" ];then
 echo
 echo " ${BASEPKG}.pupには .desktopファイルがあるように見えます"
 echo "-- このファイルはパッケージをインストールする際にメニュー"
 echo "エントリを作成するために必要な情報を持っています。"
 echo "この pup2petjpスクリプトは ${BASEPKG}.pup ファイルを展開"
 echo "しないので、.desktopファイルを100%確かめる事はできません。"
 echo "この ${BASEPKG}.pupファイルを自分で展開したい時は"
 echo "これを確認して下さい。ファイルがなければここでENTERに続けて"
 echo "「no」の文字を入力するかENTERキーだけを押して下さい。"
 echo "注意。いくつかのDotPupsにある .desktopファイルは間違った"
 echo "      エントリーを持っています。その時はここで「no」を選択して"
 echo "      新しい .desktopファイルを作成できます。しかし関連した"
 echo "      パラメータ（メニューアイコンと実行ファイル）を決定する"
 echo "      ためDotPupを展開しなければなりません。-- このスクリプトは"
 echo "      その際に助言をします。"
 echo
 echo -n "「no」と入力する(.desktopなし)かENTERキーだけ押して下さい: "
 read NODESKTOPFILE
 [ "$NODESKTOPFILE" = "no" ] && DESKTOPFILE=""
fi

PUPAPPLICATION=""
PUPCATEGORY=""
PUPEXECUTABLE=""
PUPICON16=""
PUPAPPLICATION=""
if [ "$DESKTOPFILE" = "" ];then
 echo
 echo ".pupパッケージはインストールしたファイルをPETgetパッケージマネージャ"
 echo "に登録してウィンドウマネージャのメニューエントリを作成する"
 echo "インストールスクリプトを持っている(持っていない)かも知れません。"
 echo "しかしその情報はPETget互換のフォーマットでないかも知れません。"
 echo "そのため以下の質問に答えて下さい。.pupインストールスクリプトが"
 echo "作成しようとするものは何でも無効にします。"
 echo "DotPupパッケージのメニューエントリが必要な時は"
 echo "DotPupパッケージの基本的詳細を知る必要があります。例えば"
 echo "アイコンのパス名 /path/filenames や実行ファイル"
 echo "DotPup内部の詳細をよく知らないで変換する時"
 echo "クリックしてインストールすると何がインストールされるか"
 echo "見る事ができるはずです。 -- ROX-ファイラには"
 echo "素晴らしい特徴があります。最近変更/作成されたファイルを"
 echo "太字でハイライトします。"
 echo
 echo -n "続けるにはENTERキーを押して下さい: "
 read yeahdoit

 echo
 echo "追加注意1: DotPupファイルを展開してその内容を調べる事ができます。"
 echo "ディレクトリを作成してその中に .pupファイルをコピーします。"
 echo "端末を開いて「unzip filename.pup」と入力します。その中には "
 echo "展開できる .tbzファイルを含むかも知れません: 「tar -jxf filename.tbz」"
 echo "追加注意2: このスクリプトを実行中に間違えたら"
 echo "再度実行できます。あるいは作成したPETパッケージを展開したり"
 echo "設定を編集して再びスクリプトを閉じる事ができます。"
 echo "手順は次の通りです:"
 echo "# pet2tgz pkgname.pet      (.pet を .tar.gzに変換)"
 echo "# tar -zxf pkgname.tar.gz  (TAR書庫を展開)"
 echo " ...中にあるテキストファイルを編集します。"
 echo "# tar -c -f pkgname.tar pkgname/   (TARファイルを作成)"
 echo "# gzip pkgname.tar         (.tar.gzのTAR書庫を作成)"
 echo "# tgz2pet pkgname.tar.gz   (.tar.gz を .petに変換)"
 echo
 echo -n "続けるにはENTERキーを押して下さい: "
 read yeahdoit

 echo
 echo "ウインドウマネージャメニューエントリを作りたいアプリケーションの"
 echo "カテゴリーを入力して下さい。公式パピーには以下の"
 echo "メニュー階層があります:"
 echo "(頭に 'X-' の付くカテゴリは非公式です。パピー固有)"
 echo "$PUPHIERARCHY"
 echo
 echo -n "CATEGORIESコラムから一語を入力して下さい。: "
 read PUPCATEGORY
 
 echo
 echo "実行ファイル名を入力して下さい。実行ファイルがパスの通った"
 echo "場所、はっきり言うと /bin, /sbin, /usr/bin,"
 echo "/usr/sbin, /root/my-applications/bin か /usr/local/bin"
 echo "にあれば実行ファイル名だけ入力する必要があります。"
 echo "パスはいりません。例: mtpaint"
 echo "ほとんどのDotPupはこのディレクトリの内の一つにインストールされます。"
 echo "通常は /usr/local/bin です。例: Gfnrename-0.4は実行ファイルを"
 echo "/usr/local/Gfnrename-0.4/gfnrename だけでなく"
 echo "/usr/local/bin/gfnrename にインストールします。プログラムを"
 echo "実行する時には後者が使われるように意図されています。"
 echo
 echo -n "実行ファイルのパスを入力して下さい: "
 read PUPEXECUTABLE
 echo
 
 echo "ウィンドウマネージャメニューエントリで使うアイコン名を入力して下さい。"
 echo "これは16x16ピクセルの . xpmファイルでなくてはいけません。"
 echo "(.png でもいいですが全てのウィンドウマネージャには合いません)"
 echo "このアイコンが /usr/local/lib/X11/mini-icons にあれば"
 echo "パスを明記する必要はありません。"
 echo "アイコンが別の場所にあればフルパスを与えなければいけません。"
 echo "例えば: DotPup Gfnrename-0.4 は16x16のアイコンを"
 echo "/usr/local/Gfnrename-0.4/icon.xpmでインストールします。"
 echo "これは16x16ピクセルアイコンでなければいけません。大きくてはだめです！"
 echo
 echo -n "アイコンのパスを入力して下さい: "
 read PUPICON16
 
 echo
 echo "メニューに表示したいアプリケーション名を入力して下さい。"
 echo "これはメニューエントリの最初の語になります。"
 echo "例: Abiword"
 echo
 echo -n "アプリケーション名を入力して下さい: "
 read PUPAPPLICATION
fi

echo
echo "1から3語の説明を入力して下さい。これはウィンドウマネージャの"
echo "メニューエントリ(もしあれば)でアプリケーション名の直後に表示"
echo "されるので、とても短くなければいけません。"
echo "これは他の目的にも使われます。"
echo "例えば、/root/.packages/alienpackages.txtファイルです。"
echo "(このファイルのエントリはPETgetがパッケージ管理のために使います)"
echo "Abiwordの例: wordprocessor"
echo
echo -n "「とても短い」説明を入力して下さい(引用符なしで): "
read PUPMENUDESCR

echo
echo "パピーに組み込まれた公式パッケージリスト:"
cat /root/.packages/packages.txt | grep '" on "' | cut -f 2 -d '"' | cut -f 1 -d '-' | tr '\n' ' ' #' Geany fix.
echo
echo
echo "上のリストはパピーに組み込まれたパッケージです。これは全部"
echo "pup_xxx.sfsファイル(CDから起動したならCD)に入ってます。"
echo -n "続けるにはENTERキーを押して下さい: "
read yabbado
echo
echo "以下は追加できる公式パッケージです:"
cat /root/.packages/packages.txt | grep '" off "' | cut -f 2 -d '"' | cut -f 1 -d '-' | tr '\n' ' ' #' Geany fix.
echo
echo
echo "上でリストされたPETパッケージは pup_xxx.sfsファイルに"
echo "組み込まれなかったUnleashed一式にあります。しかし"
echo "これらはいつでも個々にインストールできます。"
echo -n "続けるにはENTERキーを押して下さい: "
read yabbado
echo
echo "作成されたPETパッケージの依存リストを入力して下さい。"
echo "すでにパピーに組み込まれたパッケージは依存としてはっきりと"
echo "名付ける必要はありません(パピーの縮小ベアボーンバージョンは"
echo "この組み込み全部がないかも知れないので最悪の状況を考慮"
echo "しなければならない事を除いて)。"
echo "この依存リストを入力する方法は次の例で示されます: パッケージ"
echo "'pupdvdtool-0.5b' は以下の依存リストがあります:"
echo "+vamps,+vobcopy,+ffmpeg,+dvdauthor,+gtkdialog"
echo "各パッケージ名は先頭に「+」を付け「,」で区切られます。"
echo "注意1: 「gtkdialog」はGTKライブラリが必要です。しかし"
echo "       下位依存を明示する必要はありません。まるで"
echo "       gtkdialogがインストールされる必要があるように"
echo "       それ自身の依存リストがあります。"
echo "注意2: /root/.packages/packages.txtファイルで"
echo "       各パッケージの依存リストを参照できます。"
echo "注意3: パッケージのバージョン番号は必要ありません。但し"
echo "       パッケージが非公式依存を必要とする場合を除きます。"
echo "       (バージョン化された依存はどれも自動的に非公式を意味します)"
echo "注意4: 何を明示したら良いかわかれなければENTERキーを押して下さい。 "
echo "       (PETgetはまだ若干の基本的依存チェックをします)"
echo
echo -n "依存リストを入力して下さい: "
read PUPOFFICIALDEPS

echo
echo "PETパッケージにはインストール時PETgetパッケージマネージャ"
echo "に登録しないオプションがあります。"
echo "これはPETのバグフィックスやパッチを当てる時に便利です。"
echo "ここでの通常の返答はENTERキーを押すだけです。"
echo "一般的にはパッケージがアンインストールできるように"
echo "PETgetに登録したいはずです。"
echo "PETパッケージをPETgetに登録しますか？"
echo -n "「はい」ならENTERを押し、そうでなければ「no」と入力して下さい: "
read PETREGISTER
[ "$PETREGISTER" = "" ] && PETREGISTER="yes"

#difficult task, separate package name from version part... 
#not perfect, some start with non-numeric version info...
NAMEONLY="`echo -n "$BASEPKG" | sed -e 's/\-[0-9].*$//g'`"
#...if that fails, do it the old way...
[ "$NAMEONLY" = "$BASEPKG" ] && NAMEONLY="`echo "$BASEPKG" | cut -f 1 -d "-"`"

#embed .pup inside a directory and create tarball...
rm -f $DIRPKG/${BASEPKG}.tar
rm -f $DIRPKG/${BASEPKG}.tar.gz
rm -f $DIRPKG/${BASEPKG}.pet
mkdir $DIRPKG/$BASEPKG
if [ "$DESKTOPFILE" = "" ];then
 echo '[Desktop Entry]' > $DIRPKG/$BASEPKG/${NAMEONLY}.desktop
 echo 'Encoding=UTF-8' >> $DIRPKG/$BASEPKG/${NAMEONLY}.desktop
 echo "Name=${PUPAPPLICATION} ${PUPMENUDESCR}" >> $DIRPKG/$BASEPKG/${NAMEONLY}.desktop
 echo "Icon=${PUPICON16}" >> $DIRPKG/$BASEPKG/${NAMEONLY}.desktop
 echo "Comment=${PUPAPPLICATION} ${PUPMENUDESCR}" >> $DIRPKG/$BASEPKG/${NAMEONLY}.desktop
 echo "Exec=${PUPEXECUTABLE}" >> $DIRPKG/$BASEPKG/${NAMEONLY}.desktop
 echo "Terminal=false" >> $DIRPKG/$BASEPKG/${NAMEONLY}.desktop
 echo "Type=Application" >> $DIRPKG/$BASEPKG/${NAMEONLY}.desktop
 echo "Categories=${PUPCATEGORY}" >> $DIRPKG/$BASEPKG/${NAMEONLY}.desktop
 echo "GenericName=${PUPAPPLICATION} ${PUPMENUDESCR}" >> $DIRPKG/$BASEPKG/${NAMEONLY}.desktop
fi
#echo "PUPAPPLICATION='${PUPAPPLICATION}'" > $DIRPKG/$BASEPKG/${BASEPKG}.pet.specs
echo "PETMENUDESCR='${PUPMENUDESCR}'" > $DIRPKG/$BASEPKG/${BASEPKG}.pet.specs
echo "PETOFFICIALDEPS='${PUPOFFICIALDEPS}'" >> $DIRPKG/$BASEPKG/${BASEPKG}.pet.specs
echo "PETREGISTER='${PETREGISTER}'" >> $DIRPKG/$BASEPKG/${BASEPKG}.pet.specs
mv $DIRPKG/${BASEPKG}.pup $DIRPKG/$BASEPKG/
tar --remove-files -c -f $DIRPKG/${BASEPKG}.tar $DIRPKG/$BASEPKG/
gzip $DIRPKG/${BASEPKG}.tar
rmdir $DIRPKG/$BASEPKG
TARBALL="$DIRPKG/${BASEPKG}.tar.gz"

FULLSIZE="`stat --format=%s ${TARBALL}`"
MD5SUM="`md5sum $TARBALL | cut -f 1 -d ' '`"
echo -n "$MD5SUM" >> $TARBALL
sync
mv -f $TARBALL $DIRPKG/${BASEPKG}.pet
sync

echo "${BASEPKG}.pet が作成されました。終了。"

###END###
