diff --git a/pkgquery b/pkgquery index 2f76275..a737848 100755 --- a/pkgquery +++ b/pkgquery @@ -1,15 +1,33 @@ #!/bin/sh +# +# scratchpkg +# +# Copyright (c) 2018 by Emmett1 (emmett1.2miligrams@gmail.com) +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . +# msg() { echo "==> $1" } msgerr() { - msg "ERROR: $@" + msg "ERROR: $*" } msgwarn() { - msg "WARNING: $@" + msg "WARNING: $*" } msginst() { @@ -21,7 +39,7 @@ msgmiss() { } msgnoinst() { - echo "[ ] $1" + echo "[-] $1" } needarg() { @@ -43,6 +61,12 @@ allinstalled() { grep ^name "$INDEX_DIR"/*/.pkginfo | awk '{print $3}' } +installed_pkg_info() { + if isinstalled $1; then + grep ^$2 "$INDEX_DIR/$1/.pkginfo" | cut -d " " -f3- + fi +} + getdepends() { ppath=$(getportpath $1) || return 0 grep "^# depends[[:blank:]]*:" $ppath/$BUILD_SCRIPT \ @@ -63,30 +87,19 @@ getportpath() { } 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 + needarg $@ + if port=$(getportpath $1); then + grep -R "# depends[[:blank:]]*:" $REPO \ + | sed "s,:# depends[[:blank:]]*:[[:blank:]]*,#|,;s, ,|,g;s,$,|,g" \ + | grep "|$1|" \ + | awk -F "#" '{print $1}' \ + | rev \ + | awk -F / '{print $2}' \ + | rev + else + msgerr "Port '$1' not exist." + return 1 + fi } pkg_orphan() { @@ -101,6 +114,87 @@ pkg_orphan() { rm "$tmpalldep" "$tmpallpkg" } +pkg_dup() { + dup=$(find $REPO -type d -print | grep -Exv "($(echo $REPO | tr ' ' '|'))" | \ + rev | cut -d '/' -f1 | rev | sort | uniq -d) + + if [ "$dup" ]; then + for dp in $dup; do + for repo in $REPO; do + [ -d $repo/$dp ] && echo "$repo/$dp" + done + done + else + msg "No duplicate ports found." + fi +} + +pkg_foreign() { + for pkg in $(allinstalled); do + if ! getportpath $pkg >/dev/null; then + iname=$(installed_pkg_info $pkg name) + iversion=$(installed_pkg_info $pkg version) + irelease=$(installed_pkg_info $pkg release) + echo "$iname $iversion-$irelease" + fi + unset iname iversion irelease + done +} + +pkg_search() { + needarg $@ + arg=$@ + for repo in $REPO; do + out=$(grep -R "# description" $repo | grep $BUILD_SCRIPT | grep "$arg" | awk -F : '{print $1}') + [ "$out" ] || continue + for line in $out; do + repo=$(echo $line | rev | awk -F / '{print $3}' | rev) + desc=$(grep "^# description[[:blank:]]*:" $line | sed 's/^# description[[:blank:]]*:[[:blank:]]*//') + name=$(grep "^name=" $line | awk -F = '{print $2}') + version=$(grep "^version=" $line | awk -F = '{print $2}') + release=$(grep "^release=" $line | awk -F = '{print $2}') + echo "($repo) $name $version-$release: $desc" + unset repo desc name version release + done + unset out + done +} + +pkg_locked() { + for pkg in $(allinstalled); do + [ -f "$INDEX_DIR/$pkg/.lock" ] && echo "$pkg" + done +} + +pkg_installed() { + for all in $(allinstalled); do + printf "%s" "$all " + grep -e ^version -e ^release $INDEX_DIR/$all/.pkginfo | awk '{print $3}' | tr '\n' '-' | sed 's:\-$::' + echo + done +} + +pkg_missingdep() { + for pkg in $(allinstalled); do + if getportpath "$pkg" >/dev/null; then + depends=$(getdepends $pkg) + fi + if [ "$depends" ]; then + for d in $depends; do + if ! isinstalled $d; then + if [ -z "$msd" ]; then + msd="$d" + else + msd="$msd $d" + fi + fi + done + fi + [ "$msd" ] && echo "$pkg: $msd" + unset depends msd + done +} + pkg_info() { needarg $@ ppath=$(getportpath $1) || return 1 @@ -111,14 +205,14 @@ pkg_info() { 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" + echo "Name: $1" + echo "Path: $ppath" + echo "Version: $version" + echo "Release: $release" + echo "Description: $desc" + echo "Homepage: $url" + echo "Maintainer: $maint" + echo "Dependencies: $deps" } pkg_depends() { @@ -175,26 +269,6 @@ pkg_readme() { 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 @@ -214,6 +288,32 @@ pkg_cat() { fi } +pkg_help() { + cat << EOF +Usage: + $(basename $0) [] + +Options: + search find ports in repo + cat print spkgbuild + depends print dependencies + dependent print dependent + path print path in repo + provide print port's provided files + readme print readme file, if exist + files print files installed + info print information + dup print duplicate ports in repo + installed print all installed ports + locked print loacked ports + missingdep print missing dependencies + orphan print orphan installed ports + foreign print foreign ports + help print this help msg + +EOF +} + BUILD_SCRIPT="spkgbuild" INDEX_DIR="$ROOT_DIR/var/lib/scratchpkg/index" REPO_FILE="/etc/scratchpkg.repo" @@ -224,11 +324,11 @@ if [ -f "$REPO_FILE" ]; then done fi -OP=$1 +opts=$1 shift -if [ $(type -t pkg_$OP) ]; then - pkg_$OP $@ +if [ $(type -t pkg_$opts) ]; then + pkg_$opts "$@" else pkg_help exit 1