diff --git a/pkgbuild b/pkgbuild index 2355adc..49ad39b 100755 --- a/pkgbuild +++ b/pkgbuild @@ -60,26 +60,33 @@ generatemdsum() { } checkmdsum() { - TMPCHECKSUM=$WORK_DIR/checksums.$$ + TMPCHECKSUM=$WORK_DIR/checksumstmp.$$ + ORICHECKSUM=$WORK_DIR/checksumsori.$$ + DIFCHECKSUM=$WORK_DIR/checksumsdiff.$$ if [ ! -f .checksums ]; then msg "Generating .checksums..." generatemdsum > .checksums else msg "Checking checksums..." - generatemdsum > $TMPCHECKSUM - mismatch=$(diff -w -t -U 0 .checksums $TMPCHECKSUM | sed '/^---/d;/^+++/d;/^@@/d' | awk '{print $2}' | uniq) + generatemdsum > "$TMPCHECKSUM" + sort -k2 .checksums > "$ORICHECKSUM" + diff -w -t -U 0 "$ORICHECKSUM" "$TMPCHECKSUM" > "$DIFCHECKSUM" fi - rm -f $TMPCHECKSUM + [ -s "$DIFCHECKSUM" ] && { + mismatch=1 + cat "$DIFCHECKSUM" \ + | sed '/---/d' \ + | sed '/+++/d' \ + | sed '/@@/d' \ + | sed 's/^-/ -> missing: /' \ + | sed 's/^+/ -> new : /' + } - if [ "$mismatch" ]; then - msgerr "md5sum mismatch:" - for m in $mismatch; do - msg2 $m - done - abort 1 - fi + rm -f "$TMPCHECKSUM" "$DIFCHECKSUM" "$ORICHECKSUM" + + [ "$mismatch" = 1 ] && abort 1 } download_src() { diff --git a/pkgquery b/pkgquery new file mode 100755 index 0000000..2f76275 --- /dev/null +++ b/pkgquery @@ -0,0 +1,237 @@ +#!/bin/sh + +msg() { + echo "==> $1" +} + +msgerr() { + msg "ERROR: $@" +} + +msgwarn() { + msg "WARNING: $@" +} + +msginst() { + echo "[i] $1" +} + +msgmiss() { + echo "[m] $1" +} + +msgnoinst() { + echo "[ ] $1" +} + +needarg() { + [ "$*" ] || { + msgerr "This operation required an arguments!" + exit 1 + } +} + +isinstalled() { + if [ -s "$INDEX_DIR/$1/.pkginfo" ] && [ "$(grep $1 $INDEX_DIR/$1/.pkginfo)" ]; then + return 0 + else + return 1 + fi +} + +allinstalled() { + grep ^name "$INDEX_DIR"/*/.pkginfo | awk '{print $3}' +} + +getdepends() { + ppath=$(getportpath $1) || return 0 + grep "^# depends[[:blank:]]*:" $ppath/$BUILD_SCRIPT \ + | sed 's/^# depends[[:blank:]]*:[[:blank:]]*//' \ + | tr ' ' '\n' \ + | awk '!a[$0]++' \ + | sed 's/,//' +} + +getportpath() { + for repo in $REPO; do + if [ -f $repo/$1/$BUILD_SCRIPT ]; then + dirname $repo/$1/$BUILD_SCRIPT + return 0 + fi + done + return 1 +} + +pkg_dependent() { + needarg $@ + for repo in $REPO; do + if [ -d $repo ]; then + for all in $repo/*/$BUILD_SCRIPT; do + [ -f $all ] || continue + depend=$(grep "^# depends[[:blank:]]*:" $all | sed 's/^# depends[[:blank:]]*:[[:blank:]]*//' | tr ' ' '\n' | awk '!a[$0]++') + for dep in ${depend[@]}; do + if [ $dep = $1 ]; then + GDP=yes + pname=$(dirname $all) + pname=${pname##*/} + if isinstalled $pname; then + msginst "$pname" + else + msgnoinst "$pname" + fi + break + fi + done + done + fi + done + + [ "$GDP" ] && return 0 || return 1 +} + +pkg_orphan() { + tmpallpkg="/tmp/.pkgquery_allpkg.$$" + tmpalldep="/tmp/.pkgquery_alldep.$$" + for pkg in $(allinstalled); do + echo $pkg >> $tmpallpkg + dep="$dep $(getdepends $pkg)" + done + echo $dep | tr ' ' '\n' | sort | uniq > "$tmpalldep" + grep -xvF -f "$tmpalldep" "$tmpallpkg" + rm "$tmpalldep" "$tmpallpkg" +} + +pkg_info() { + needarg $@ + ppath=$(getportpath $1) || return 1 + + . $ppath/$BUILD_SCRIPT + desc=$(grep "^# description[[:blank:]]*:" $ppath/$BUILD_SCRIPT | sed 's/^# description[[:blank:]]*:[[:blank:]]*//') + url=$(grep "^# homepage[[:blank:]]*:" $ppath/$BUILD_SCRIPT | sed 's/^# homepage[[:blank:]]*:[[:blank:]]*//') + maint=$(grep "^# maintainer[[:blank:]]*:" $ppath/$BUILD_SCRIPT | sed 's/^# maintainer[[:blank:]]*:[[:blank:]]*//') + deps=$(getdepends $1 | tr '\n' ' ') + + echo -e "Name: $1" + echo -e "Path: $ppath" + echo -e "Version: $version" + echo -e "Release: $release" + echo -e "Description: $desc" + echo -e "Homepage: $url" + echo -e "Maintainer: $maint" + echo -e "Dependencies: $deps" +} + +pkg_depends() { + needarg $@ + if getportpath "$1" >/dev/null; then + depends=$(getdepends $1) + else + msgerr "Port '$1' not exist." + return 1 + fi + + for dep in $depends; do + if isinstalled $dep; then + msginst "$dep" + elif getportpath $dep >/dev/null; then + msgnoinst "$dep" + else + msgmiss "$dep" + fi + done +} + +pkg_path() { + needarg $@ + if PPATH=$(getportpath "$1"); then + echo "$PPATH" + else + msgerr "Port '$1' not exist." + return 1 + fi +} + +pkg_provide() { + needarg $@ + arg=$(echo $1 | sed "s/^\///") + grep -R "$arg" $INDEX_DIR/*/.files \ + | sed "s:$INDEX_DIR/::" \ + | sed "s:/.files::" \ + | tr : " " \ + | column -t +} + +pkg_readme() { + needarg $@ + if PPATH=$(getportpath "$1"); then + if [ -f "$PPATH/readme" ]; then + cat "$PPATH/readme" + else + msgerr "Port '$1' does not have readme." + fi + else + msgerr "Port '$1' not exist." + exit 1 + fi +} + +scratch_info() { + needarg $@ + ppath=$(getportpath $pkg) || return 1 + + . $ppath/$BUILD_SCRIPT + desc=$(grep "^# description[[:blank:]]*:" $ppath/$BUILD_SCRIPT | sed 's/^# description[[:blank:]]*:[[:blank:]]*//') + url=$(grep "^# homepage[[:blank:]]*:" $ppath/$BUILD_SCRIPT | sed 's/^# homepage[[:blank:]]*:[[:blank:]]*//') + maint=$(grep "^# maintainer[[:blank:]]*:" $ppath/$BUILD_SCRIPT | sed 's/^# maintainer[[:blank:]]*:[[:blank:]]*//') + deps=$(get_depends $pkg | tr '\n' ' ') + + echo -e "Name: $pkg" + echo -e "Path: $ppath" + echo -e "Version: $version" + echo -e "Release: $release" + echo -e "Description: $desc" + echo -e "Homepage: $url" + echo -e "Maintainer: $maint" + echo -e "Dependencies: $deps" +} + +pkg_files() { + needarg $@ + if isinstalled $1; then + cat "$INDEX_DIR/$1/.files" + else + msg "Package '$1' not installed." + fi +} + +pkg_cat() { + needarg $@ + if PPATH=$(getportpath "$1"); then + cat "$PPATH/$BUILD_SCRIPT" + else + msgerr "Port '$1' not exist." + return 1 + fi +} + +BUILD_SCRIPT="spkgbuild" +INDEX_DIR="$ROOT_DIR/var/lib/scratchpkg/index" +REPO_FILE="/etc/scratchpkg.repo" + +if [ -f "$REPO_FILE" ]; then + for repodir in $(grep -Ev '^(#|$)' "$REPO_FILE" | awk '{print $1}'); do + REPO="$REPO $repodir" + done +fi + +OP=$1 +shift + +if [ $(type -t pkg_$OP) ]; then + pkg_$OP $@ +else + pkg_help + exit 1 +fi + +exit $?