#!/bin/sh

usage() {
    printf "Argument missing\n"
    exit 2
}
[ -z $1 ] && usage


# MAKE SURE MARKFILE EXISTS
MARKFILE="/var/cache/pmark"
if [ ! -f "${MARKFILE}" ]
then
    doas touch "${MARKFILE}"
    doas sdk:sdk "${MARKFILE}"
fi

portmark() {
    printf "%s" "${PWD}" > ${MARKFILE}
    printf "marked.\n"
}

portsrcdir() {
    printf "%s" "$(cat "${MARKFILE}")"
}
portobjdir() {
    cd "$(cat "${MARKFILE}")" \
        && printf "%s" "$(make show=WRKSRC)"
}

portclean() {(
    cd /usr/ports
    doas rm -rf /usr/ports/{pobj/*,plist,logs,packages,bulk,update}
    doas make fix-permissions > /dev/null
    echo done
)}

portdiff() {
    _opwd="$PWD"
    _name="$(make show=PKGNAME)"
    _epoch="$(make show=EPOCH)"
    _rev="$(make show=REVISION)"
    _patchname="${_name}${_epoch:+v$_epoch}${_rev:+p$_rev}"
    cd /usr/ports \
        && doas cvs -d sdk@cvs.openbsd.org:/cvs diff -uNp $(echo "$_opwd" \
        | sed 's,/data/cvs/ports/,,g' \
        | sed 's,/usr/ports/,,g') \
        > /home/sdk/diffs/${_patchname}.diff
    grep '^?' /home/sdk/diffs/${_patchname}.diff
    cd "$_opwd"
    printf "Patch created: /home/sdk/diffs/%s.diff\n" "$_patchname"
}

portpack() {
    _dir="$(basename "$(readlink -f  .)")"
    cd ..
    doas tar czvf "${_dir}.tgz" "${_dir}" \
    && readlink -f "${_dir}.tgz"
    cd -
}

portjump() {
    if [ -z $1 ]
    then
        echo /usr/ports
        exit 0
    fi
    _dirs="archivers astro audio benchmarks biology books bulk \
           cad chinese comms converters databases devel editors \
           education emulators fonts games geo graphics inputmethods \
           japanese java korean lang mail math meta misc multimedia \
           net news plan9 print productivity security shells sysutils \
           telephony textproc wayland www x11"
    for d in $_dirs
    do
        if [ -d /usr/ports/$d/$1 ]
        then
            echo /usr/ports/$d/$1
        fi
    done
}

case $1 in
    mark) portmark; ;;
    src) portsrcdir; ;;
    obj) portobjdir; ;;
    clean) portclean; ;;
    diff) portdiff; ;;
    pack) portpack; ;;
    jump) portjump $2; ;;
esac