os/brick.sh

190 lines
3.4 KiB
Bash
Executable File

#!/bin/sh
# brick - a simple userspace package manager for blek!OS
# also built on top of pacman
#
# made by alice
# also it is GPL3 only uwu
# settings
set -e
# functions
errcho() {
# now this was stolen from https://stackoverflow.com/a/2990533
# uwu
echo "$@" 1>&2;
}
err() {
printf "\x1b[1;31m[!]\x1b[0m $@\n" 1>&2;
}
inf() {
printf " $@\n"
}
getbrick() {
echo $BRICKS_DIR/$1.brick
}
brickdb() {
mkdir -p $BRICKS_DIR/.db
if ! [ -f $BRICKS_DIR/.db/installed ]; then
touch $BRICKS_DIR/.db/installed
fi
echo $BRICKS_DIR/.db
}
pkg_installed() {
if [ ! -z $(echo "$BRICKS_INSTALLED" | grep "$1") ]; then
return 0
fi
return 1
}
user_confirm() {
# base function was stolen from https://stackoverflow.com/a/32708121
if [ "$AUTOMATIC" == "true" ]; then
return 0
fi
while true; do
read -r -n 1 -p "${1:-Continue?} [Y/n]: " REPLY
case $REPLY in
[yY]) echo ; return 0 ;;
[nN]) echo ; return 1 ;;
*) return 0 ;;
esac
done
}
# some vars
BRICKS_DIR=${BRICKS_DIR:-}
PKGS=()
ERRORED=false
AUTOMATIC=false
# setting the BRICKS_DIR var
BRICKS_PWD=$(pwd)
while :; do
# lets jump to the parent dir until we find the bricks dir
if [ -d $BRICKS_PWD/bricks ]; then
# yay we found it ^^
BRICKS_DIR=$BRICKS_PWD/bricks
break
fi
if [ $BRICKS_PWD = "/" ]; then
err "Didnt find the bricksdir in this or any parent directory (excluding root)"
exit 1
fi
done
unset BRICKS_PWD
BRICKS_DB=$(brickdb)
BRICKS_INSTALLED=$(cat $BRICKS_DB/installed)
# settings the PKGS var
# lets grab those from argv
while [[ $# -gt 0 ]]; do
case $1 in
-y|--noconfirm)
AUTOMATIC=true
shift;;
-L)
inf "listing packages"
for pkg in $(find $BRICKS_DIR -maxdepth 1 -type f -printf "%f\n" | grep -E \\.brick$ | sed 's/.brick//'); do
source $(getbrick $pkg)
inf "$(inf "$pkg - $(info)")"
done
inf 'done'
exit 0
;;
-*)
# meh domt need unkonw args
shift;;
*)
# everything else is a package name however
PKGS+=("$1")
shift;;
esac
done
PPKGS=()
# now step 1 is to check that all packages are there
for pkg in "${PKGS[@]}"; do
if ! [ -f $(getbrick $pkg) ]; then
err "Oh no! Brick $pkg is not found in $BRICKS_DIR"
ERRORED=true
fi
if pkg_installed "$pkg"; then
echo $pkg is installed, skipping
else
PPKGS=("${PPKGS[@]}" $pkg)
fi
done
PKGS=("${PPKGS[@]}")
if [ "$ERRORED" == "true" ]; then
exit 1
fi
if [ "${#PKGS[@]}" == "0" ]; then
inf "nothing to do"
exit
else
echo "Packages to install: ${PKGS[@]}"
user_confirm
fi
PACDEPS=()
# lets first collect the packages
for pkg in "${PKGS[@]}"; do
source $(getbrick $pkg)
IFS=' ' read -ra DEPS <<< $(pkgs)
PACDEPS=("${PACDEPS[@]}" "${DEPS[@]}")
done
# so yeah lets do it
if [ "${#PACDEPS[@]}" != "0" ]; then
# first, gotta filter out the ones that are already installed
INSTALLED=$(pacman -Qe)
TO_INSTALL=''
for pkg in $PACDEPS; do
if [[ ! -z $(echo $INSTALLED | grep $pkg) ]]; then
TO_INSTALL="$TO_INSTALL $pkg"
fi
done
inf "installing pacman packages:"
inf "$TO_INSTALL"
# welp lets install those
sudo pacman -S --needed --noconfirm $TO_INSTALL
inf "installed all pacman deps"
else
inf "no pacman deps to install"
fi
i=1
# pacman deps installed, lets install the actual shit
for pkg in "${PKGS[@]}"; do
inf "installing $pkg [$i/${#PKGS[@]}]"
SCRIPT="
export BRICKS_DIR=$BRICKS_DIR
export BRICKS_DB=$BRICKS_DB
source $(getbrick $pkg)\n
install"
echo -e "$SCRIPT" | bash > $BRICKS_DB/.$pkg-install-log
i=$(($i + 1))
done
inf "done"