#!/bin/bash

# DU does not provide an accurate calculation of disk usage on ROOTFS.
# This function adds space for the BOOT partition "512MB" and more or
# less depending on the overall size of the ROOTFS partition.
calculate (){
DU=`du -sh ROOTFS | sed 's/ROOTFS//g' | sed s/'\s'//g | sed 's/G//g'`
CALC=$(echo $DU + 1.0 | bc | sed 's/\.//g')
GB=$(echo $CALC | head -c 1)
if [[ "$GB" == "1" ]]; then CALC=$(echo $DU + 0.9 | bc | sed 's/\.//g'); fi
if [[ "$GB" == "2" ]]; then :; fi
if [[ "$GB" == "3" ]]; then CALC=$(echo $DU + 1.2 | bc | sed 's/\.//g'); fi
if [[ "$GB" == "4" ]]; then CALC=$(echo $DU + 1.3 | bc | sed 's/\.//g'); fi
if [[ "$GB" == "5" ]]; then CALC=$(echo $DU + 1.4 | bc | sed 's/\.//g'); fi
if [[ "$GB" == "6" ]]; then CALC=$(echo $DU + 1.5 | bc | sed 's/\.//g'); fi
if [[ "$GB" == "7" ]]; then CALC=$(echo $DU + 1.6 | bc | sed 's/\.//g'); fi
if [[ "$GB" == "8" ]]; then CALC=$(echo $DU + 1.7 | bc | sed 's/\.//g'); fi
if [[ "$GB" == "9" ]]; then CALC=$(echo $DU + 1.8 | bc | sed 's/\.//g'); fi
IMGSIZE="${CALC}00MB"
}

# shrink
shrink (){
export LC_ALL=C.UTF-8
IMAGE_FILE="${BOARD_EXT}-${DISTRO}-${DISTRO_VERSION}-${IMAGE_DATE}.img"
if [[ -f "${IMAGE_FILE}" ]]; then mv -f ${IMAGE_FILE} shrink.img; else echo "Shrink failed! Missing file ${IMAGE_FILE}."; exit 0; fi
KPARTX="$(kpartx -av shrink.img)"
if [[ "$HOST_MACHINE" == "Ubuntu" ]]; then
	# snapd woes; grep for higher loop numbers.
	LOOP=`grep -o 'loop[0-9]\+p.' <<<"$KPARTX"`
else
	LOOP=`grep -o 'loop.p.' <<<"$KPARTX"`
fi
B_LOOP=`echo "$LOOP" | sed -n '1p'`
R_LOOP=`echo "$LOOP" | sed -n '2p'`
BOOT_LOOP="/dev/mapper/$B_LOOP"
ROOTFS_LOOP="/dev/mapper/$R_LOOP"
BOOT="${BOOT_LOOP}"
ROOTFS="${ROOTFS_LOOP}"
if [[ "$FSTYPE" == "ext4" ]]; then fsck.${FSTYPE} -pf "$ROOTFS" > /dev/null 2>&1; fi
mkdir -p BOOT; mkdir -p ROOTFS
sleep .50
mount "${BOOT}" BOOT; mount "${ROOTFS}" ROOTFS
sleep .50
calculate
if [ $RAM -ne 0 ]; then IMAGE_FOLDER="ram/"; fi
mkdir -p "$IMAGE_FOLDER"
if [ $RAM -ne 0 ]; then mount -t tmpfs -o size=4G tmpfs $IMAGE_FOLDER; fi
partition > /dev/null 2>&1; uuid
echo ""
echo -en "Shrinking ${PNK}[${FIN}${WHT}${IMGSIZE}${FIN}${PNK}]${FIN}"
cp -ax BOOT/* p1/
if [ $VERBOSE -eq 1 ]; then
	if [[ "$FSTYPE" == "btrfs" ]]; then cp -axv ROOTFS/@/* p2/; else cp -axv ROOTFS/* p2/; fi
else
	if [[ "$FSTYPE" == "btrfs" ]]; then cp -ax ROOTFS/@/* p2/; else cp -ax ROOTFS/* p2/; fi
fi
sleep .75
echo -en " ${PNK}[${FIN}${YLW}cleaning${FIN}${PNK}]${FIN}"
umount BOOT; umount ROOTFS
sleep .75
rm -fdr BOOT; rm -fdr ROOTFS
kpartx -d shrink.img
rm -f shrink.img
fstab > /dev/null 2>&1
cmdline > /dev/null 2>&1
umount p2; umount p1
if [[ "$FSTYPE" == "ext4" ]]; then fsck.${FSTYPE} -pf "${IMAGE_LOOP_DEV_ROOTFS}" > /dev/null 2>&1; fi
losetup -d "${IMAGE_LOOP_DEV}"
mv "${IMAGE_FOLDER}${IMAGE_FILE_NAME}" "${IMAGE_FILE_NAME}"
if [ $RAM -ne 0 ]; then umount "${IMAGE_FOLDER}"; fi
rmdir "${IMAGE_FOLDER}"
rmdir p1 p2
echo -e " ${PNK}[${FIN}${GRN}done${FIN}${PNK}]${FIN}"
}
