#! /bin/bash

#
# move parts of initrd into squashfs images
#

function err {
  echo $1
  exit 1
}

function squash {
  local compression="-comp xz"
  # see doc/compression.md
  if [[ "$instsys_no_compression" =~ "squashfs" ]] ; then
    compression="-no-compression"
  fi
  mkdir -p parts
  $mksquashfs $1 parts/$2 $compression -noappend -no-progress
  chmod 644 parts/$2
}

dir=$1

[ -d "$dir" ] || err "$dir: not a directory"
cd $dir

[ -d "parts" ] && { echo "$dir: already gefrickelt" ; exit 1 ; }

[ -x "/usr/bin/mksquashfs" ] && mksquashfs="/usr/bin/mksquashfs"
[ -x "/usr/bin/mksquashfs4" ] && mksquashfs="/usr/bin/mksquashfs4"

[ -z "$mksquashfs" ] && err "mksquashfs missing"

if [ -L lib ]; then
  pfx="usr/"
fi

if [ -n "$instsys_no_compression" ] ; then
  echo "$instsys_no_compression" > .no_compression
  echo "using no compression in squashfs\n"
fi

# - - -  lib/{modules,firmware}  - - -
#
# all mods ex loop & squashfs
#
# see also data/initrd/scripts/zram_setup
#
base_modules="loop squashfs lz4_decompress lz4_compress lz4hc_compress 842_compress 842_decompress xxhash zstd_decompress zram ext4 crc16 mbcache jbd2"
echo "$base_modules" > .base_modules
m_dir=`echo ${pfx}lib/modules/*/initrd`
[ -d "$m_dir" ] || err "no kernel module dir"
mkdir -p "b/$m_dir"
for i in $base_modules ; do
  for suffix in ko ko.xz ko.zst; do
    [ -f $m_dir/$i.$suffix ] && mv $m_dir/$i.$suffix b/$m_dir
  done
done
mkdir -p a/${pfx}lib
mv ${pfx}lib/modules a/${pfx}lib
[ -d ${pfx}lib/firmware ] && mv ${pfx}lib/firmware a/${pfx}lib
# but NOT udev
# [ -d lib/udev ] && mv lib/udev a/lib
mv b/${pfx}lib/modules ${pfx}lib
squash a 00_lib
rm -rf a b

# - - -  usr  - - -
#
# keep libs for linuxrc
#
# lib vs. lib64
lib_dir=usr/lib
mkdir -p "b/$lib_dir"
# for usrmerge
if [ -e  "$lib_dir/modules" ]; then
  mv "$lib_dir/modules" "b/$lib_dir"
fi
if [ -d ${lib_dir}64 ]; then
  lib_dir=${lib_dir}64
fi
mkdir -p "b/$lib_dir"
# don't forget .lib*.hmac files (bsc#1178208)
for i in $lib_dir/lib* $lib_dir/.lib*; do
  case $i in *librpm*) continue ;; esac
  mv $i b/$lib_dir
done
# need to keep the linker in usrmerge case
if [ -n "$pfx" ]; then
  mv $lib_dir/ld-* b/$lib_dir || :
fi

# empty usr/sbin is needed to avoid bsc#1169094 (cross-filesystem relative
# symlinks to kmod)
mkdir -p b/usr/bin b/usr/sbin
# some things are needed from /usr/bin or /usr/sbin
for i in kmod bash mount setsid sh ln touch chmod mkdir insmod mkfs.ext2 ; do
  [ -e usr/bin/$i -o -L usr/bin/$i ] && mv usr/bin/$i b/usr/bin
  [ -e usr/sbin/$i -o -L usr/sbin/$i ] && mv usr/sbin/$i b/usr/sbin
done
mkdir -p a
mv usr a
mv b/usr .
squash a 01_usr
rm -rf a b

