#!/bin/sh # # pkgmng written by pancake@phreaker.net # updates on: http://pancake.host.sk/altres/src/pkgmng # ** package manager for pkgsrc ** # updated: 29/08/05 # 29/08/04 - add 'list' new features, add clean command. # 14/09/04 - add pkgfind in install # ######################################################################## # Take care on this variables if something goes wrong. #======================================================================= # SF_USER="" LOCALBASE=/usr/pkg MAKE=/usr/bin/make if [ -e "${LOCALBASE}/bin/bmake" ]; then MAKE=${LOCALBASE}/bin/bmake fi PKGSRC_DIR=/usr/pkgsrc PKGSRC_DB=/var/db/pkg export CVSROOT=anoncvs@anoncvs.NetBSD.org:/cvsroot export CVS_RSH=ssh #. /etc/mk.conf # ######################################################################## cd ${PKGSRC_DIR} show_depends() { if [ ${1} = "" ]; then return 1; fi cd ${PKGSRC_DIR} echo "Direct depends for ${1}: " for A in $1/Makefile.common $1/Makefile; do if [ ! -e "${A}" ]; then continue; fi cat ${A} | grep "include \"../../" | grep -v "mk/" 2> /dev/null cat ${A} | grep DEPENDS | grep -v BUILD 2> /dev/null done echo "--" cd - return 0 } getPkgName() { PKG=${1} PKG=`echo ${PKG}| awk '{ gsub("-"," " );print $0; }'` set $PKG PKG="" while : ; do FOO="`echo $1 | bc 2>/dev/null `" case "${FOO}" in ""|"0") PKG="${PKG}$1-" ;; *) #PKG=`echo ${PKG} | awk '{ print substr($1,0,length($1)-1);}'` break; ;; esac shift if [ "$2" = "" ]; then break; fi done PKG=`echo ${PKG} | awk '{ print substr($1,0,length($1)-1);}'` echo "${PKG}" } if [ "${1}" = "" ]; then echo "Usage $0 method [args]" echo " Login - [L] Login to NetBSD CVS." echo " cvsync - [c] cvsync (Need cvsync.conf in $PREFIX/etc)" echo " whereis [pkgnames] - [w] find where is a package." echo "* Whereis [words] - [W] Look inside DESCR for packages." echo " show [pkgnames] - [s] show pkg description." echo " Search [file] [categ] - [S] Search file into packages." echo " fetch [pkgsrc|wip][pkg] - [f] fetch official and/or wip tree." echo " get [cat/pkgnames] - [g] get package and shows deps." echo " install [pkgnames] - [i] install packages." echo " delete [pkgnames] - [d] remove packages." echo " clean - [C] clean all builds." echo " list - [l] list duplicated packages." echo " Find|find [file] - [F|f] Find 'file' in pkgsrc or find in installed" echo " update - [u] Update pkgsrc tree." echo "* wip-import [pkg] - [I] Import to pkgsrc-wip." echo "" echo "* - means that aren't yet done. get/fetch must be joined." exit fi case "$1" in "C"|"clean") WRKOBJDIR=`grep -e WRKOBJDIR /etc/mk.conf|awk -F = '{ print $2; }` if [ -z "${WRKOBJDIR}" ]; then echo "WRKOBJDIR not defined in mk.conf" cd ${PKGSRC_DIR} echo "Scanning pkgsrc tree for dirty dirs..." PKGTOCLEAN=`find . | grep work | awk -F / '{print $2"/"$3; }'|uniq` echo "Done." else echo "WRKOBJDIR=${WRKOBJDIR}" cd ${WRKOBJDIR} PKGTOCLEAN=`echo */*`; fi echo "Need to clean: ${PKGTOCLEAN}"; for A in ${PKGTOCLEAN} ; do if [ ! -e ${PKGSRC_DIR}/${A} ]; then continue fi cd ${PKGSRC_DIR}/${A} printf "${A} " ${MAKE} clean > /dev/null 2>&1 echo OK done ;; "L"|"Login") export CVSROOT=:pserver:anoncvs@anoncvs.NetBSD.org:/cvsroot cd /usr echo "*****************************************" echo "*** ***" echo "*** PASSWORD IS: 'anoncvs' ***" echo "*** ***" echo "*****************************************" cvs login ;; "c"|"cvsync") echo "** I WILL MOVE ${PKGSRC_DIR} TO ${PKGSRC_DIR}../wip" cd ${PKGSRC_DIR} mv wip ../ cvsync mv ../wip ./ ;; "S"|"Search") DIR="*/*/PLIST*" if [ "${2}" = "" ]; then echo "Usage: ${0} Search filename [category]" exit fi if [ ! "${3}" = "" ]; then DIR="${3}/*/PLIST*" fi echo "Searching files in ${DIR}..." grep -e ${2} ${DIR} ;; "f"|"find") if [ "${2}" = "" ]; then echo "Usage $0 find [file]" exit fi cd $PKGSRC_DB for A in * ; do if [ -e "${A}/+CONTENTS" ]; then FILES=`grep -e ${2} ${A}/+CONTENTS|grep -v comment`; if [ ! "${FILES}" = "" ]; then echo "$A" fi fi done ;; "F"|"Find") echo notyet ;; "w"|"whereis") if [ "${2}" = "" ]; then echo "Usage $0 whereis [pkgnames] ..." exit fi while : ; do for A in $(ls | grep -v CVS) ; do if [ -d ${A} ]; then LOOK=$(ls ${A} | grep "${2}" | grep -v CVS) HOWM=`printf "${LOOK}\n"|wc -l|awk '{print $1;}'` if [ ! "${LOOK}" = "" ]; then #printf "\e[33m${2}\e[32m (${HOWM}) at ${A}/ \e[0m \t " printf "${2} (${HOWM}) ${A}/ \t " printf "$(echo ${LOOK})\n" continue; fi fi done shift; if [ "$2" = "" ]; then break; fi done ;; "W"|"Whereis") echo "TODO" ;; "s"|"show") if [ "${2}" = "" ]; then echo "Usage $0 show [pkgname]" exit fi while : ; do STR="`echo ${2} | grep /`" if [ "${STR}" = "" ]; then pkg_info -d ${2} 2> /dev/null || \ echo Package '${2}' not installed else show_depends ${2} pkg_info -d ${2} 2> /dev/null || \ (cat ${2}/Makefile ${2}/Makefile.common | grep -e COMMENT \ -e HOMEPAGE \ -e MASTER_SITES 2> /dev/null && \ echo "" && cat ${2}/DESCR 2> /dev/null ) || \ echo Package ${2} not found fi shift; if [ "${2}" = "" ]; then break; fi done ;; "f"|"fetch") if [ "$2" = "pkgsrc" -o "$2" = "" ]; then echo "==> PKGSRC" cd .. while : ; do # Fetch a list of pkg echo "==> Fetching $3 from pkgsrc..." cvs -q co -P pkgsrc/$3 if [ ! "$?" = "0" ]; then echo "Please first login:"; cvs login else shift; fi if [ "$3" = "" ]; then break; fi done fi if [ "$2" = "" -o "$2" = "wip" ]; then echo "==> WIP" cd ${PKGSRC_DIR} if [ "$3" = "" ]; then printf "Username for cvs.sourceforge.net: " read USER else USER=$3 fi # TODO This while, must be a concat string while : ; do # Fetch all packages echo "==> Fetching $4 from wip..." cvs -q -dP -d:ext:$USER@cvs.sourceforge.net:/cvsroot/pkgsrc-wip \ co wip/$4 shift; if [ "$4" = "" ]; then break; fi done # Clear empty directories echo "==> Clearing empty directories..." cd ${PKGSRC_DIR}/wip for A in * ; do if [ -e $A/CVS/Entries ]; then if [ "`cat $A/CVS/Entries |wc -l|awk ' { print $1 }'`" = "1" ]; then echo " => Removing $A." rm -rf $A fi fi done else echo "Please usage: '$0 fetch [pkgsrc [?]|wip [user] [?]]"; fi cd - ;; "l"|"list") #echo "Now check for packages. Press enter to continue." #read #ls ${PKGSRC_DB}|sort|less echo "Possible duplicated packages:" FOO=`pkg_info -a| awk '{ print $1 }' |sort`; OLD="" for A in ${FOO} ; do if [ "${OLD}" = "`getPkgName "${A}"`" ]; then echo ${OLD} PKGS=`pkg_info -e "${OLD}" ` for A in ${PKGS}; do DEPS=`pkg_info -q -R ${A}|wc -l 2>/dev/null`; echo " | ${A} ${DEPS}" done fi OLD=`getPkgName "${A}"` done ;; "i"|"install") if [ "${2}" = "" ]; then echo "Usage $0 install [pkgnames] ..." exit fi while : ; do PKGDIR=${2} cd ${2} 2>/dev/null if [ ! "$?" = "0" ]; then PKGDIR="`pkgfind -xcq ${2} 2>/dev/null`"; if [ "${PKGDIR}" = "" ]; then echo "Package '${2}' not found." break; fi cd ${PKGDIR} if [ ! "$?" = "0" ]; then echo "Cannot find pkg ${2}." break; fi fi show_depends ${PKGDIR}; echo "==> Looking for versions" PKGINSTAL=`pkg_info ${2} 2>/dev/null` if [ ! "${PKGINSTAL}" = "" ]; then VMISMATCH=`echo ${PKGDIR} |pkg_chk -C /dev/stdin -c` if [ "${VMISMATCH}" = "" ]; then echo "This package is yet updated." else echo "==> Updating package '${2}'" ${MAKE} replace package clean clean-depends fi else ${MAKE} install package clean clean-depends fi cd .. shift; if [ "${2}" = "" ]; then break; fi done ;; "d"|"del"|"delete") while : ; do echo "Removing ${2}..." STR="`echo ${2} | grep /`" if [ "${STR}" = "" ]; then pkg_delete ${2} else cd ${STR} 2> /dev/null if [ ! "$?" = "0" ]; then echo "Package not found" exit 1; fi make deinstall fi shift; if [ "${2}" = "" ]; then break; fi done ;; "g"|"get") if [ "${2}" = "" ]; then echo "Usage $0 get [pkgnames] ..." exit fi cd .. while : ; do echo "Getting $2..." ( cvs co -P pkgsrc/$2 && \ show_depends ${2} ) || echo "Error: package does not exist" shift; if [ "${2}" = "" ]; then break; fi done ;; update) echo "Updating ${PKGSRC_DIR}..." cd ${PKGSRC_DIR} cvs -q update -dP # PKGTOOLS UPDATES echo "==> Checking pkgtools apps versions for updates" echo pkgtools/* | pkg_chk -C /dev/stdin -c | grep mism ;; *) echo "Unsupported method '$1'." exit 1 ;; esac exit 0