Files
scratchpkg/scratch-old
2018-07-23 17:38:15 +08:00

1236 lines
27 KiB
Bash
Executable File

#!/bin/bash
RED='\e[0;31m' #Red
GREEN='\e[0;32m' #Green
YELLOW='\e[0;33m' #Yellow
BLUE='\e[0;34m' #Blue
PURPLE='\e[0;35m' #Purple
CYAN='\e[0;36m' #Cyan
CRESET='\e[0m' #Reset color
INDEX_DIR="/var/lib/scratchpkg/index"
BUILD_SCRIPT="spkgbuild"
nocolor() {
RED=
GREEN=
YELLOW=
CYAN=
CRESET=
}
msg() {
echo -e "${GREEN}==>${CRESET} $1"
}
msg2() {
echo -e " ${CYAN}*${CRESET} $1"
}
msgerr() {
echo -e "${RED}==> ERROR:${CRESET} $1"
}
msgwarn() {
echo -e "${YELLOW}==> WARNING:${CRESET} $1"
}
msginst() {
echo -e "[${GREEN}i${CRESET}] $1"
}
msgmiss() {
echo -e "[${YELLOW}m${CRESET}] $1"
}
msgnoinst() {
echo -e "[ ] $1"
}
pushd() {
command pushd "$1" >/dev/null
}
popd() {
command popd "$1" >/dev/null
}
#
# helper func
#
confirm() {
read -r -p "$1 (Y/n) " response
case "$response" in
[Nn][Oo]|[Nn]) echo "$2"; exit 2 ;;
*) : ;;
esac
}
vercomp() {
if [ "$1" = "$2" ]; then
return 0 # same version
elif [ "$1" = "$(echo -e "$1\n$2" | sort -V | head -n1)" ]; then
return 1 # $1 lower than $2
else
return 2 # $1 higher than $2
fi
}
installed_pkg_info() {
if [ -f $INDEX_DIR/$2/.pkginfo ]; then
echo $(cat $INDEX_DIR/$2/.pkginfo | grep ^$1 | cut -d " " -f3-)
fi
}
checktool() {
if ! type -p $1 &>/dev/null; then
msgerr "'$1' not exist in your system!"
exit 1
fi
}
allinstalled() {
ls ${INDEX_DIR}/*/.pkginfo | rev | cut -d '/' -f2 | rev 2>/dev/null
}
needroot() {
if [ $UID != 0 ]; then
if [ "$#" -eq 0 ]; then
needroot "This operation"
else
msgerr "$@ need root access!"
fi
exit 1
fi
}
needarg() {
if [ -z "$@" ]; then
msgerr "This operation require arguments!"
return 1
else
return 0
fi
}
getpkgcache() {
for list in $(ls "$PACKAGE_DIR"); do
[ -f "$PACKAGE_DIR"/$list ] && ALL_PACKAGES+=($list)
done
for list in $(ls "$SOURCE_DIR"); do
[ -f "$SOURCE_DIR"/$list ] && ALL_SOURCES+=($list)
done
for repo in ${PORT_REPO[@]}; do
for port in $(ls $repo); do
if [ -f $repo/$port/$BUILD_SCRIPT ]; then
. $repo/$port/$BUILD_SCRIPT
PORT_PACKAGES+=($name-$version-$release.spkg.txz)
if [ ! -z $source ]; then
for src in ${source[@]}; do
if [ $(echo $src | grep -E "(ftp|http|https)://") ]; then
if [ $(echo $src | grep -E "::(ftp|http|https)://") ]; then
sourcename="$(echo $src | awk -F '::' '{print $1}')"
else
sourcename="$(echo $src | rev | cut -d / -f 1 | rev)"
fi
SOURCE_NAMES+=($sourcename)
fi
done
fi
fi
done
done
for i in ${PORT_PACKAGES[@]}; do
for pkg in ${!ALL_PACKAGES[@]}; do
if [ "${ALL_PACKAGES[pkg]}" = "$i" ]; then
unset 'ALL_PACKAGES[pkg]'
break
fi
done
done
for a in ${SOURCE_NAMES[@]}; do
for src in ${!ALL_SOURCES[@]}; do
if [ "${ALL_SOURCES[src]}" = "$a" ]; then
unset 'ALL_SOURCES[src]'
break
fi
done
done
}
getportpath() {
for repo in ${PORT_REPO[@]}; do
if [[ -f $repo/$1/$BUILD_SCRIPT ]]; then
echo "$(dirname $repo/$1/$BUILD_SCRIPT)"
return 0
fi
done
return 1
}
checkdep() {
if getportpath "$1" >/dev/null; then
pushd $(getportpath "$1")
getpkginfo
popd
fi
for dep in ${depends[@]}; do
echo $dep
done
}
#
# main func
#
missingdep() {
for pkg in $(allinstalled); do
msd=()
msmd=()
dep=$(installed_pkg_info depends $pkg)
if [ ${#dep[@]} -gt 0 ]; then
for d in ${dep[@]}; do
if [ ! -f "$INDEX_DIR"/$d/.pkginfo ]; then
msd+=($d)
fi
done
fi
if [ ${#mdep[@]} -gt 0 ]; then
for md in ${mdep[@]}; do
if [ ! -f "$INDEX_DIR"/$md/.pkginfo ]; then
msmd+=($md)
fi
done
fi
if [ ${#msd[@]} -gt 0 ]; then
echo -e "${GREEN}$pkg${CRESET} missing ${RED}${msd[@]}${CRESET}"
fi
if [ ${#msmd[@]} -gt 0 ]; then
echo -e "${GREEN}$pkg${CRESET} missing ${RED}${msmd[@]}${CRESET} ${BLUE}(make)${CRESET}"
fi
done
}
showportpath() {
if PPATH=$(getportpath "$1"); then
echo "$PPATH"
else
msgerr "Port '$1' not exist."
exit 1
fi
}
showtree() {
if [ ! -f $INDEX_DIR/$1/.pkginfo ]; then
msg "Package ${RED}$1${CRESET} not installed."
else
while IFS=' ' read -r line; do
echo "$line"
done < <(cat $INDEX_DIR/$1/.files)
fi
}
checkowner() {
for pkg in $(allinstalled); do
for output in $(cat $INDEX_DIR/$pkg/.files | grep $1); do
echo -e "${CYAN}$pkg${CRESET} => ${PURPLE}$output${CRESET}"
done
done
}
showdependent() {
for port in ${PORT_REPO[@]}; do
if [ -d $port ]; then
for all in $(ls $port/*/$BUILD_SCRIPT | rev | cut -d '/' -f2 | rev 2>/dev/null); do
if [ -f $port/$all/$BUILD_SCRIPT ]; then
depend=$(cat $port/$all/$BUILD_SCRIPT | grep ^'# depends' | tr -d ':' | cut -d " " -f3-)
for dep in ${depend[@]}; do
if [ $dep = $1 ]; then
GDP=yes
if [ -d $INDEX_DIR/$all ]; then
msginst "$all"
else
msgnoinst "$all"
fi
fi
done
fi
done
fi
done
[ "$GDP" ] || msg "No package depends on '$1'."
}
showdependent2() {
if [ ! -d $INDEX_DIR/$1 ]; then
msg "Package ${RED}$1${CRESET} not installed."
exit 1
else
for all_installed in $(ls $INDEX_DIR); do
depend=$(cat $INDEX_DIR/$all_installed/.pkginfo | grep ^depends | cut -d " " -f3-)
for dep in ${depend[@]}; do
if [ $dep = $1 ]; then
DP=yes
echo -e "$all_installed"
fi
done
done
fi
[ "$DP" ] || msg "No package depends on '$1'."
}
catport() {
if PPATH=$(getportpath "$1"); then
cat "$PPATH/$BUILD_SCRIPT"
else
msgerr "Port '$1' not exist."
exit 1
fi
}
printreadme() {
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
}
listports() {
for repo in ${PORT_REPO[@]}; do
if [ "$1" = "$(basename $repo)" ]; then
REPO_EXIST=yes
for ports in $(ls $repo/*/$BUILD_SCRIPT | rev | cut -d '/' -f2 | rev 2>/dev/null); do
. "$repo/$ports/$BUILD_SCRIPT"
if [ -f "$PACKAGE_DIR/$name-$version-$release.spkg.txz" ]; then
echo -e "$name ${GREEN}$version${CRESET}-${CYAN}$release${CRESET} ${PURPLE}[*]${CRESET}"
else
echo -e "$name ${GREEN}$version${CRESET}-${CYAN}$release${CRESET}"
fi
done
fi
done
[ "$REPO_EXIST" ] || msgerr "Repository ${RED}$1${CRESET} not exist."
}
listlocked() {
for pkg in "$INDEX_DIR"/*/.pkginfo; do
pkgpath=$(dirname $pkg)
pkgname=$(basename $pkgpath)
if [ -f "$pkgpath"/.lock ]; then
echo -e "$pkgname"
fi
done
}
lockpkg() {
needroot "Locking package"
for pkg in "$@"; do
if [ ! -d $INDEX_DIR/$pkg ]; then
msgerr "Package '$pkg' is not installed."
else
touch $INDEX_DIR/$pkg/.lock && msg "Successfully locked package '$pkg'."
fi
done
}
unlockpkg() {
needroot "Unlocking package"
for pkg in "$@"; do
if [ ! -d $INDEX_DIR/$pkg ]; then
msgerr "Package '$pkg' is not installed."
elif [ ! -f $INDEX_DIR/$pkg/.lock ]; then
msgerr "Package '$pkg' is not locked."
else
rm $INDEX_DIR/$pkg/.lock && msg "Successfully unlocked package '$pkg'."
fi
done
}
foreignpkg() {
for pkg in $(allinstalled); do
if ! getportpath $pkg >/dev/null; then
echo -e $pkg
fi
done
}
clearpkgcache() {
needroot "Removing package & source cache"
getpkgcache
if [ ${#ALL_PACKAGES[@]} -gt 0 ]; then
for pkg in ${ALL_PACKAGES[@]}; do
rm -v $PACKAGE_DIR/$pkg
done
fi
if [ ${#ALL_SOURCES[@]} -gt 0 ]; then
for src in ${ALL_SOURCES[@]}; do
rm -v $SOURCE_DIR/$src
done
fi
}
pkgcache() {
getpkgcache
if [ ${#ALL_PACKAGES[@]} -gt 0 ]; then
ALL_PACKAGES_SIZE=$(pushd "$PACKAGE_DIR" && du -ch ${ALL_PACKAGES[@]} | grep total | awk '{print $1}' && popd)
else
ALL_PACKAGES_SIZE=0M
fi
if [ ${#ALL_SOURCES[@]} -gt 0 ]; then
ALL_SOURCES_SIZE=$(pushd "$SOURCE_DIR" && du -ch ${ALL_SOURCES[@]} | grep total | awk '{print $1}' && popd)
else
ALL_SOURCES_SIZE=0M
fi
msg "${CYAN}Package cache ($ALL_PACKAGES_SIZE):${CRESET}"
[ ${#ALL_PACKAGES[@]} -gt 0 ] && (echo ${ALL_PACKAGES[@]} | tr ' ' '\n') || echo "(none)"
echo ""
msg "${CYAN}Source cache ($ALL_SOURCES_SIZE):${CRESET}"
[ ${#ALL_SOURCES[@]} -gt 0 ] && (echo ${ALL_SOURCES[@]} | tr ' ' '\n') || echo "(none)"
}
sysup() {
needroot "Upgrading package"
PKGOUTDATE=$(outdatepkg)
if [ ! "$PKGOUTDATE" ]; then
msg "All package is up to date."
exit 0
fi
echo "Resolving dependencies..."
DEP=($(pkgdeplist ${PKGOUTDATE[@]} -l | rev | awk '{print $1}' | rev))
echo
UPGPKG=0
NEWPKG=0
for d in ${DEP[@]}; do
if [ "$(echo ${PKGOUTDATE[@]} | tr ' ' '\n' | grep -x $d)" = "$d" ]; then
echo -ne "[${GREEN}u${CRESET}] $d "
WILLINSTALL+=($d)
UPGPKG=$(( $UPGPKG + 1 ))
elif [ ! -e "$INDEX_DIR/$d/.pkginfo" ] && getportpath "$d" >/dev/null; then
echo -ne "[${CYAN}n${CRESET}] $d "
WILLINSTALL+=($d)
NEWPKG=$(( $NEWPKG + 1 ))
fi
done
echo
echo
echo "Package(s) will be upgraded : $UPGPKG"
echo "New package(s) will be installed : $NEWPKG"
echo
confirm "Continue upgrade/install these package(s)?" "Package upgrade cancelled."
echo
for inst in ${WILLINSTALL[@]}; do # install all required dependencies and target packages itself
if [ ! -e "$INDEX_DIR/$inst/.pkginfo" ]; then
portinstall $inst -is || exit 1
else
portinstall $inst -us || exit 1
fi
done
}
outdatepkg() {
for pkg in $(allinstalled); do
if [ ! -e "$INDEX_DIR/$pkg/.lock" ] && getportpath $pkg >/dev/null; then
. $(getportpath $pkg)/$BUILD_SCRIPT
iversion=$(installed_pkg_info version $pkg)
irelease=$(installed_pkg_info release $pkg)
if [ "$release" != "$irelease" ] || [ "$version" != "$iversion" ]; then
echo $name
fi
fi
done
}
checkupdate() {
for pkg in $(allinstalled); do
if getportpath $pkg >/dev/null; then
. $(getportpath $pkg)/$BUILD_SCRIPT
iversion=$(installed_pkg_info version $pkg)
irelease=$(installed_pkg_info release $pkg)
[ -f "$INDEX_DIR/$pkg/.lock" ] && ITSLOCK="[locked]"
outdatemsg="$name ${RED}$iversion-$irelease${CRESET} => ${GREEN}$version-$release${CRESET} ${BLUE}$ITSLOCK${CRESET}"
newerinstmsg="$name ${RED}$iversion-$irelease${CRESET} => ${GREEN}$version-$release${CRESET} ${YELLOW}[newer installed]${CRESET} ${BLUE}$ITSLOCK${CRESET}"
if [ "$version" != "$iversion" ]; then
vercomp $version $iversion
if [ $? = 2 ]; then
echo -e "$outdatemsg"
OUTDATE=yes
elif [ $? = 1 ]; then
echo -e "$newerinstmsg"
OUTDATE=yes
fi
elif [ "$release" != "$irelease" ]; then
vercomp $release $irelease
if [ $? = 2 ]; then
echo -e "$outdatemsg"
OUTDATE=yes
elif [ $? = 1 ]; then
echo -e "$newerinstmsg"
OUTDATE=yes
fi
fi
unset ITSLOCK
fi
done
[ ! "$OUTDATE" ] && msg "All package is up to date."
}
checkintegrity() {
pushd $ROOT_DIR
for pkg in $(allinstalled); do
while IFS=' ' read -r line; do
if [ ! -e "$line" ]; then
echo -e "${BLUE}$pkg${CRESET} is missing: ${PURPLE}/$line${CRESET}"
MISSING_FILE=yes
fi
done < <(cat $INDEX_DIR/$pkg/.files)
done
popd
[ "$UID" != "0" ] && msg "${YELLOW}(check integrity is recommended run as root or using sudo)${CRESET}"
[ ! "$MISSING_FILE" ] && msg "Your system file is consistent with package tree."
}
listorphan() {
# fetch all depends in all installed package
for pkg in $(allinstalled); do
dep=$(installed_pkg_info depends $pkg)
for deps in ${dep[@]}; do
ALL_DEP+=($deps)
done
done
# find orphan package
for all in $(ls $INDEX_DIR); do
ORPHAN=yes
for depended in ${ALL_DEP[@]}; do
if [ $depended = $all ]; then
ORPHAN=no
break
fi
done
if [ "$ORPHAN" = yes ]; then
iname=$(installed_pkg_info name $all)
iversion=$(installed_pkg_info version $all)
irelease=$(installed_pkg_info release $all)
echo -e "$iname ${GREEN}$iversion${CRESET}-${BLUE}$irelease${CRESET}"
fi
done
}
listinstalled() {
for pkg in $(allinstalled); do
iname=$(installed_pkg_info name $pkg)
iversion=$(installed_pkg_info version $pkg)
irelease=$(installed_pkg_info release $pkg)
echo -e "$iname ${GREEN}$iversion${CRESET}-${BLUE}$irelease${CRESET}"
done
}
duplicateports() {
dup=$(find ${PORT_REPO[@]} -type d -print | egrep -xv "($(echo ${PORT_REPO[@]} | tr ' ' '|'))" | \
rev | cut -d '/' -f1 | rev | sort | uniq -d)
if [ "$dup" ]; then
for dp in $dup; do
for repo in ${PORT_REPO[@]}; do
reponame=$(basename $repo)
[ -d $repo/$dp ] && echo "$repo/$dp"
done
done
else
msg "No duplicate ports found."
fi
}
searchpkg() {
local port found OUTPUT
for port in ${PORT_REPO[@]}; do
if [ -d $port ]; then
pushd $port
OUTPUT=$(grep -R description | grep "$BUILD_SCRIPT:# description[[:blank:]]*:" | sed "s/$BUILD_SCRIPT:# description[[:blank:]]*://" | grep -i "$1" | cut -d '/' -f1)
popd
if [ -n "$OUTPUT" ]; then
found=yes
for out in ${OUTPUT[@]}; do
if [ -f $port/$out/$BUILD_SCRIPT ]; then
pushd $port/$out
description=$(grep "^# description[[:blank:]]*:" $BUILD_SCRIPT | sed 's/^# description[[:blank:]]*:[[:blank:]]*//')
. $BUILD_SCRIPT
popd
if [ ! -z "$name" ] && [ ! -z "$version" ] && [ ! -z "$release" ]; then
portname=$(basename $port)
search_result="${PURPLE}($portname)${CRESET} $name ${CYAN}$version-$release${CRESET} $description"
if [ -e $INDEX_DIR/$name/.pkginfo ]; then
echo -e "[${GREEN}*${CRESET}] $search_result"
else
echo -e "[ ] $search_result"
fi
unset description name version release
fi
fi
done
fi
fi
done
if [ ! "$found" ]; then
msg "No matching package found."
fi
}
showdepends() {
if getportpath "$1" >/dev/null; then
pushd $(getportpath "$1")
depends=$(grep "^# depends[[:blank:]]*:" $BUILD_SCRIPT | sed 's/^# depends[[:blank:]]*:[[:blank:]]*//')
popd
else
msgerr "Port ${RED}$1${CRESET} not exist."
exit 1
fi
for dep in ${depends[@]}; do
if [ -d $INDEX_DIR/$dep ]; then
msginst "$dep"
elif getportpath $dep >/dev/null; then
msgnoinst "$dep"
else
msgmiss "$dep"
fi
done
}
deplist() {
# check currently process package for loop
if [ ${#CHECK[@]} -gt 0 ]; then
if [[ "$(echo ${CHECK[@]} | tr " " "\n" | grep -x $1)" == "$1" ]]; then
return 0
fi
fi
#if [[ $(echo ${DEP[@]} | tr " " "\n" | grep -x $i) = "$i" ]]; then
#return 0
#fi
# add package to currently process
CHECK+=($1)
# check dependencies
for i in $(checkdep $1); do
if [[ $(echo ${DEP[@]} | tr " " "\n" | grep -x $i) = "" ]]; then
deplist $i
fi
done
# add dependency to list checked dep
if [[ $(echo ${DEP[@]} | tr " " "\n" | grep -x $1) = "" ]]; then
DEP+=($1)
fi
# delete process package array
for i in "${!CHECK[@]}"; do
if [[ ${CHECK[i]} = "$1" ]]; then
unset 'CHECK[i]'
fi
done
}
portinstall() {
if getportpath "$1" >/dev/null; then
pushd "$(getportpath $1)"
shift
pkgbuild "$@" || exit 1
popd
else
msgerr "Port '$1' not found."
fi
}
updports() {
checktool httpup
needroot "Updating ports"
if [ ! -e /etc/scratchpkg.repo ]; then
msgerr "Repo file not found! (/etc/scratchpkg.repo)"
exit 1
fi
while read repodir repourl junk; do
case $repodir in
""|"#"*) continue ;;
esac
if [ -n "$repodir" ] && [ -n "$repourl" ]; then
httpup sync $repourl $repodir
fi
done < /etc/scratchpkg.repo
}
help() {
cat << EOF
Usage:
$(basename $0) [ mode ] [ <pkgname> <options> ]
mode:
install <packages> install packages and its dependencies
upgrade <packages> upgrade packages and install new dependencies (if any)
build <package> build only packages
remove <packages> remove packages in system
depends <package> show depends of a package
deplist <packages> show list dependencies of a package
search <pattern> search packages in port's repos
lock <packages> lock packages from upgrade
unlock <packages> unlock packages from upgrade
listport <repo> list ports of a repo
cat <package> view a package build scripts
dependent <package> show package's dependent
own <file> show package's owner of file
pkgtree <package> show list files of installed package
path <package> show package's buildscripts path
sync update port's repo
sysup full system update
dup print duplicate ports in repo
readme print readme file if exist
listinst list installed package in system
listorphan list orphan package
integrity check integrity of package's files
outdate check for outdate packages
cache print leftover cache
rmcache remove leftover cache
missingdep check for mising dependency of installed package
foreignpkg print package installed without port in repo
listlocked print locked packages
help print this help message
options for:
build
-f, --force-rebuild force rebuild
-m, --skip-mdsum skip md5sum check for sources
-d, --no-dep skip dependency check
-e, --extract extract only
-w, --keep-work keep woring directory
-o, --download download source files only
-v, --verbose be verbose
--redownload re-download source files
--srcdir=<path> override default SOURCE_DIR
--pkgdir=<path> override default PACKAGE_DIR
--no-preinstall skip pre-install script
install
-d, --no-dep skip installing dependencies
-c, --ignore-conflict skip file conflict check
-r, --reinstall reinstall installed package
--no-preinstall skip pre-install script
--no-postinstall skip post-install script
upgrade
-d, --no-dep skip installing dependencies (new dependencies)
-c, --ignore-conflict skip file conflict check
-v, --verbose print install process
--no-backup skip backup configuration file
--no-preupgrade skip pre-upgrade script
--no-postupgrade skip post-upgrade script
remove
-d, --no-dep skip dependency check
-v, --verbose print removed files
--no-preremove skip pre-remove script
--no-postremove skip post-remove script
global options:
--no-color disable colour for output
--debug debug $(basename $0) script
EOF
}
extract_opt() {
for opt in $@; do
case $opt in
--*) MAINOPTS+=($opt) ;;
-*) for (( i=1; i<${#opt}; i++ )); do MAINOPTS+=(-${opt:$i:1}); done ;;
*) MAINOPTS+=($opt) ;;
esac
done
}
# set mode
mode=$1
shift
extract_opt "$@"
# strip global options
for i in ${MAINOPTS[@]}; do
case $i in
--no-color) nocolor ;;
--debug) set -x ;;
*) ARG+=($i)
esac
done
if [ ! -d "$INDEX_DIR" ]; then
msgerr "'$INDEX_DIR' not exist."
exit 1
fi
if [ -f /etc/scratchpkg.repo ]; then
while read repodir repourl junk; do
case $repodir in
""|"#"*) continue ;;
esac
PORT_REPO+=($repodir)
done < /etc/scratchpkg.repo
fi
# build mode
if [ "$mode" = "build" ]; then
parseopt() {
while [ "$1" ]; do
case $1 in
-f|-m|-d|-x|-w|-o|-v|--verbose|--srcdir=*|--pkgdir=*) OPTS+=($1) ;;
--skip-mdsum|--no-dep|--extract|--keep-work|--download) OPTS+=($1) ;;
--force-rebuild|--redownload|--no-preinstall) OPTS+=($1) ;;
-*) msgerr "Invalid build option! ($1)"; exit 1 ;;
*) PKG=$1 ;;
esac
shift
done
}
parseopt ${ARG[@]}
needarg "$PKG" || exit 1
if getportpath "$PKG" >/dev/null; then
portinstall "$PKG" "${OPTS[@]}"
else
msgerr "Package '$PKG' not exist."
exit 1
fi
exit $?
fi
# install mode
if [ "$mode" = "install" ]; then
needroot "Installing package"
parseopt() {
while [ "$1" ]; do
case $1 in
-c|--ignore-conflict) OPTS+=($1) ;;
--no-preinstall|--no-postinstall) OPTS+=($1) ;;
-r|--reinstall) OPTS+=($1); REINSTALL=1 ;;
-d|--no-dep) NO_DEP=1 ;;
-*) msgerr "Invalid option! ($1)"; exit 1 ;;
*) PKG+=($1) ;;
esac
shift
done
}
parseopt ${ARG[@]}
if [ "$REINSTALL" ]; then
for pkg in "${PKG[@]}"; do
portinstall "$pkg" -r ${OPTS[@]}
done
exit 0
else
for pkg in ${!PKG[@]}; do # filter installed package
if [ -e "$INDEX_DIR/${PKG[pkg]}/.pkginfo" ]; then
msg "Package '${PKG[pkg]}' already installed."
unset 'PKG[pkg]'
fi
done
fi
if [ "${#PKG[@]}" = 0 ]; then
exit 0
fi
if [ "$NO_DEP" ]; then
echo; count=0
for pkg in "${PKG[@]}"; do
count=$(( $count + 1 ))
echo -ne "($count) $pkg "
done
echo; echo
confirm "Continue install these package(s) without its dependencies?" "Package installation cancelled."
for pkg in "${PKG[@]}"; do
portinstall "$pkg" -i ${OPTS[@]}
done
else
for pkg in ${PKG[@]}; do # check for existence of package
if ! getportpath "$pkg" >/dev/null; then
msgerr "Package '$pkg' not exist."
exit 1
fi
done
echo "Resolving dependencies..."
DEP=($(pkgdeplist ${PKG[@]} -n -l))
echo
if [ ${#DEP[@]} -gt 0 ]; then
count=0
for dep in ${DEP[@]}; do
count=$(( $count + 1 ))
echo -ne "($count) $dep "
done
echo; echo
confirm "Continue install these package(s)?" "Package installation cancelled."
echo
for inst in ${DEP[@]}; do # install all required dependencies and target packages itself
portinstall $inst -is ${OPTS[@]}
done
fi
fi
exit 0
fi
if [ "$mode" = "upgrade" ]; then
needroot "Upgrading package"
parseopt() {
while [ "$1" ]; do
case $1 in
--no-backup|--no-preupgrade|--no-postupgrade) OPTS+=($1) ;;
-v|-c|--verbose|--ignore-conflict) OPTS+=($1) ;;
-d|--no-dep) NO_DEP=1 ;;
-*) msgerr "Invalid option! ($1)"; exit 1 ;;
*) PKG+=($1) ;;
esac
shift
done
}
parseopt ${ARG[@]}
needarg "$PKG" || exit 1
for pkg in ${PKG[@]}; do # check for existence of package
if [ ! -e "$INDEX_DIR/$pkg/.pkginfo" ]; then
msgerr "Package '$pkg' not installed."
exit 1
fi
if ! getportpath "$pkg" >/dev/null; then
msgerr "Package '$pkg' not exist."
exit 1
fi
done
if [ ! "$NO_DEP" ]; then
echo "Resolving new dependencies..."
DEP=($(pkgdeplist ${PKG[@]} -l | rev | awk '{print $1}' | rev))
echo
for dep in ${DEP[@]}; do # install new dep (if any)
if [ ! -e "$INDEX_DIR/$dep/.pkginfo" ]; then
if getportpath "$dep" >/dev/null; then
NEWPKG+=($dep)
fi
fi
done
fi
if [ ${#NEWPKG[@]} -gt 0 ]; then
count=0
for pkg in ${NEWPKG[@]}; do
count=$(( $count + 1 ))
echo -ne "($count) $pkg "
done
echo; echo
confirm "Continue install these new dependencies before upgrade target package(s)?" "Package installation cancelled."
for pkg in ${NEWPKG[@]}; do
portinstall $pkg -is
done
fi
for pkg in ${PKG[@]}; do # upgrade all target packages
portinstall $pkg -u ${OPTS[@]} || exit 1
done
exit $?
fi
# remove mode
if [ "$mode" = "remove" ]; then
needroot "Removing package"
parseopt() {
while [ "$1" ]; do
case $1 in
--no-preremove|--no-postremove) OPTS+=($1) ;;
-d|-v|--no-dep|--verbose) OPTS+=($1) ;;
-*) msgerr "Invalid option! ($1)"; exit 1 ;;
*) PKG+=($1) ;;
esac
shift
done
}
parseopt ${ARG[@]}
needarg "$PKG" || exit 1
confirm "Continue remove these package(s)?" "Package removing cancelled."
for pkg in ${PKG[@]}; do
pkgdel $pkg ${OPTS[@]}
done
exit 0
fi
if [ "$mode" = "depends" ]; then
needarg "$ARG" || exit 1
if getportpath "$ARG" >/dev/null; then
showdepends "$ARG"
else
msgerr "Port '$ARG' not exist!"
exit 1
fi
exit 0
fi
if [ "$mode" = "deplist" ]; then
parseopt() {
while [ "$1" ]; do
case $1 in
-*) msgerr "Invalid option! ($1)"; exit 1 ;;
*) PKG+=($1) ;;
esac
shift
done
}
parseopt ${ARG[@]}
needarg "$PKG" || exit 1
for pkg in ${PKG[@]}; do
if ! getportpath "$pkg" >/dev/null; then
msgerr "Package '$pkg' not exist."
exit 1
fi
done
for pkg in ${PKG[@]}; do
echo -ne "Calculating $pkg dependencies...\033[0K\r"
deplist "$pkg"
done
echo -ne "\033[0K"
for i in ${DEP[@]}; do
if [ -e "$INDEX_DIR/$i/.pkginfo" ]; then
msginst "$i"
elif ! getportpath "$i" >/dev/null; then
msgmiss "$i"
else
msgnoinst "$i"
fi
done
exit 0
fi
# print help message
if [ "$mode" = "help" ]; then
help
exit 0
fi
# list installed package in system
if [ "$mode" = "listinst" ]; then
listinstalled
exit 0
fi
# list orphan package (package which is no other
# package depends on it)
if [ "$mode" = "listorphan" ]; then
listorphan
exit 0
fi
# check integrity (check between package index and files in system)
if [ "$mode" = "integrity" ]; then
checkintegrity
exit 0
fi
# check package for update
if [ "$mode" = "outdate" ]; then
checkupdate
exit 0
fi
# search for old package and source cache
if [ "$mode" = "cache" ]; then
pkgcache
exit 0
fi
# delete old package and sources cache
if [ "$mode" = "rmcache" ]; then
clearpkgcache
exit 0
fi
# search for missing dependency for installed package
if [ "$mode" = "missingdep" ]; then
missingdep
exit 0
fi
# search for foreign port (installed package with no port in repos)
if [ "$mode" = "foreignpkg" ]; then
foreignpkg
exit 0
fi
# list locked package
if [ "$mode" = "listlocked" ]; then
listlocked
exit 0
fi
# print duplicate ports
if [ "$mode" = "dup" ]; then
duplicateports
exit 0
fi
# lock package from upgrade
if [ "$mode" = "lock" ]; then
needarg "$ARG" || exit 1
lockpkg "${ARG[@]}"
exit 0
fi
# unlock package from upgrade
if [ "$mode" = "unlock" ]; then
needarg "$ARG" || exit 1
unlockpkg "${ARG[@]}"
exit 0
fi
# list ports for repo (input: repo name)
if [ "$mode" = "listport" ]; then
needarg "$ARG" || exit 1
listports "$ARG"
exit 0
fi
# print out port's spkgbuild (input: port name)
if [ "$mode" = "cat" ]; then
needarg "$ARG" || exit 1
catport "$ARG"
exit 0
fi
# list dependents for port (check through repo. input: port name)
if [ "$mode" = "dependent" ]; then
needarg "$ARG" || exit 1
showdependent "$ARG"
exit 0
fi
# show package owner of files (input: filename)
if [ "$mode" = "own" ]; then
needarg "$ARG" || exit 1
checkowner "$ARG"
exit 0
fi
# show files own by package (input: port name)
if [ "$mode" = "pkgtree" ]; then
needarg "$ARG" || exit 1
showtree "$ARG"
exit 0
fi
# create port's template (input: port name)
if [ "$mode" = "path" ]; then
needarg "$ARG" || exit 1
showportpath "$ARG"
exit 0
fi
# update ports
if [ "$mode" = "sync" ]; then
updports
exit 0
fi
# search ports
if [ "$mode" = "search" ]; then
needarg "$ARG" || exit 1
searchpkg $ARG
exit 0
fi
# print readme for ports
if [ "$mode" = "readme" ]; then
needarg "$ARG" || exit 1
printreadme $ARG
exit 0
fi
# update all ports
if [ "$mode" = "sysup" ]; then
sysup
exit 0
fi
echo "Run '$(basename $0) help' to see available mode and options"
exit 1