#!/bin/sh -e
# Create/destroy temporary chroots

## SYNOPSIS:
## .Nm
## .Op Fl r
## .Op Ar pkg...

## DESCRIPTION:
## .Nm
## creates a temporary chroot using the rootfs tarball of Carbs Linux. If the
## tarball does
## .Em NOT
## exist in the user's cache directory, it will download it from the Carbs Linux
## website. If any packages are given as arguments,
## .Nm
## will install those packages to this temporary chroot. If the
## .Fl r
## flag is given,
## .Nm
## will remove the rootfs tarball and directory to download it again.

parser_definition() {
    setup REST help:usage -- "usage: ${0##*/} [-r] [pkg...]"
    flag redownload -r        hidden:1
    global_options silent
}

# shellcheck disable=1091
. cpt-lib

die() {
    rm -f carbs-rootfs.tar.xz carbs-rootfs.tar.xz.sum

    log "$@"
    log "Re-run 'cpt-chbuild' to try again."

    exit 1
}

case "$(uname -m)" in i*86) arch=i686; esac
url="https://dl.carbslinux.org/releases/${arch:-$(uname -m)}/carbs-rootfs.tar.xz"

cd "${cac_dir:?}"

# Remove the existing tarball and the chroot directory, so that they can be
# downloaded again.
[ "$redownload" ] && rm -rf carbs-rootfs.tar.xz \
                            carbs-rootfs.tar.xz.sum \
                            carbs-chroot

[ -f carbs-rootfs.tar.xz ] || {
    log "Downloading chroot tarball"
    pkg_download "$url"
}

[ -f carbs-rootfs.tar.xz.sum ] || {
    log "Downloading checksums"
    pkg_download "$url.sha256" carbs-rootfs.tar.xz.sum
}

log "Verifying checksums"
sh256 carbs-rootfs.tar.xz | diff - carbs-rootfs.tar.xz.sum ||
    die "Checksum verification failed"


[ -d carbs-chroot ] || {
    log "Extracting chroot"
    mkdir -p carbs-chroot
    (cd carbs-chroot; xz -cd ../carbs-rootfs.tar.xz | pax -r)
}

mkdir -p "${tmp_dir:?}"

log "Creating temporary chroot"
cp -a carbs-chroot "${chr_dir:=$tmp_dir/chroot}"

[ "$1" ] && {
    log "Installing extra packages"
    CPT_ROOT=$chr_dir cpt-install "$@"
}

run_hook pre-chroot "" "$chr_dir"

log "Entering chroot"
if [ "$(id -u)" -eq 0 ]; then
    cpt-chroot "$chr_dir"
    rm -rf "$chr_dir"
else
    as_root sh -c "cpt-chroot $chr_dir; rm -rf $chr_dir"
fi