#!/system/bin/sh
#
# moves apps and apps-private from sdcard back to phone
#
# malez @2010
#
# v1.4
#
# 20100323 Malez move dalvik cache + args
# 20100325 Malez move data
# 20200329 Malez force ext2 check + add end function + umount silent + recreate dalivk dir
#

KEEP=0
DALVIKONLY=0
LISTCP="app app-private data"

end() {
	sync
	#umount /system/sd
	#umount /data/dalvik-cache 2>/dev/null
	#umount /data/data 2>/dev/null
	exit $1
}


error() {
  echo "Error : $1"
  echo "exiting"

  end 1
}

errorRestore()
{
	busybox df
  	echo "restoring symlinks"
	for i in $LISTCP;
	do
		if [ -d /data/$i ] && [ ! -h /data/$i ];then
			echo "Symlink $i"
			busybox rm -fr /data/$i;
			busybox ln -s /system/sd/$i /data/$i;
		fi;
	done;

	busybox df
	error $1

}

 
for option in "$@" ; do
	echo "op: $option"
    case $option in
        -k)
            KEEP=1
            shift
            ;;
        --keep)
            KEEP=1
            shift
            ;;
	-d|--dalvik)
	    DALVIKONLY=1
	    if [ a$DATAONLY == a1 ]; then usage; fi
	    shift
	    ;;
	--data)
	    DATAONLY=1
	    LISTCP="data"
	    if [ a$DALVIKONLY == a1 ]; then usage; fi
	    shift
	    ;;
        -h|--help)
            ECHO=echo
            $ECHO "$0 script by Malez"
            $ECHO "Usage: $0 {--keep|--help}"
            $ECHO ""
            $ECHO "--help               Display this help"
            $ECHO ""
            $ECHO "-k | --keep          Do not delete files on phone after copying to sd"
            $ECHO ""
            $ECHO "-d | --dalvik        Restore dalvik ONLY on phone"
            $ECHO ""
            $ECHO "--data               Restore data ONLY on phone"
            $ECHO ""
	    $ECHO "--data and --dalvik are exclusive"

            exit 0
            ;;
        --)
        #    shift
            break
            ;;
    esac
done


# Move sd2app
if [ -e /dev/block/mmcblk0p2 ];
then
	umount /system/sd
	umount /data/dalvik-cache 2>/dev/null
	umount /data/data 2>/dev/null
        
        echo "--- Checking filesystems"

        # fsck the sdcard filesystem first
        e2fsck -y -f /dev/block/mmcblk0p2;

        # set property with exit code in case an error occurs
        setprop cm.e2fsck.errors $?;

	echo "Mount sd card" 
        mount -o noatime,nodiratime -t auto /dev/block/mmcblk0p2 /system/sd 2>&1 || error "Unable to mount ext partition from sd card"

	if [ a$DALVIKONLY == a0 ] ; then
	      for i in $LISTCP;
	      do
		      if [ -d /system/sd/$i ]; then
			  if [ -h /data/$i ]; then busybox rm -f /data/$i; fi
			  if [ ! -e /data/$i ]; then
			      mkdir /data/$i
			  fi
			  #else
			  #    echo "Erasing $i content on phone" 
			  #    busybox rm /data/$i/* >/dev/null 2>&1
			  #echo "OK"
			  #fi

			  echo "Copy $i content to phone"
			  #busybox cp -p /data/$i/* /system/sd/$i/ > $OUT 2>&1 || error "cp /data/$i/* /system/sd/$i/"
			  ls /system/sd/${i}/* > /dev/null && \
			  (busybox cp -p -f -r /system/sd/${i}/* /data/${i}/ 2>&1 || errorRestore "cp -p  -r -f /system/sd/$i/* /data/$i/")
			  busybox chown 1000:1000 /data/$i || errorRestore "chown 1000:1000 /data/$i     "
			  busybox chmod 771 /data/$i || errorRestore "chmod 771 /data/$i"
			  #if [ $i == "app" ]; then
			  #    busybox chmod 644 /data/$i/* || error "chmod 644 /data/$i/content"
			  #elif [ $i == "app-private" ]; then
			  #    busybox chmod 640 /data/$i/* || error "chmod 640 /data/$i/content"
			  #fi


	      		  if [ $KEEP == 0 ] ; then
				  echo "Erasing $i content on sd" 
				  busybox rm -fR /system/sd/$i
		      	  fi
		    fi #[ -d /system/sd/$i ]
	      done;

	      
	fi

	#always restore dalvik to phone
	busybox rm -fR /system/sd/dalvik-cache
	if [ -h /data/dalvik-cache ] || [ ! -d /data/dalvik-cache ]; then
		rm /data/dalvik-cache 2>/dev/null
		busybox mkdir /data/dalvik-cache
		busybox chown 1000:1000 /data/dalvik-cache
		busybox chmod 771 /data/dalvik-cache

	fi


	echo "Everything OK"

else
        error "No ext partition found!";
	end 1
fi;

end 0;

