diff --git a/apt-cyg b/apt-cyg index 6bd8e03..fab659e 100755 --- a/apt-cyg +++ b/apt-cyg @@ -43,10 +43,8 @@ Commands: searchall Search for a filename from all available packages Options: - -c, --cache set cache - -f, --file read package names from file - -m, --mirror set mirror - --help + --cache set cache + --mirror set mirror --version + @@ -58,7 +56,7 @@ The MIT License (MIT) Copyright (c) 2005-9 Stephen Jungels + -ARCH=${HOSTTYPE/i6/x} +readonly usage version function wget { if command wget -h &>/dev/null @@ -75,26 +73,26 @@ function find-workspace { # default working directory and mirror # work wherever setup worked last, if possible - cache=$(awk ' + readonly cache=$(awk ' /last-cache/ { getline print $1 } ' /etc/setup/setup.rc | cygpath -f-) - mirror=$(awk ' + readonly mirror=$(awk ' /last-mirror/ { getline print $1 } ' /etc/setup/setup.rc) - mirrordir=$(sed ' + readonly mirrordir=$(sed ' s / %2f g s : %3a g ' <<< "$mirror") - mkdir -p "$cache/$mirrordir/$ARCH" - cd "$cache/$mirrordir/$ARCH" + mkdir -p "$cache/$mirrordir/$arch" + cd "$cache/$mirrordir/$arch" if [ -e setup.ini ] then return 0 @@ -105,22 +103,16 @@ function find-workspace { } function get-setup { - touch setup.ini - mv setup.ini setup.ini-save - wget -N $mirror/$ARCH/setup.bz2 - if [ -e setup.bz2 ] + if wget -N $mirror/$arch/setup.bz2 then bunzip2 setup.bz2 mv setup setup.ini echo Updated setup.ini - else - echo Error updating setup.ini, reverting - mv setup.ini-save setup.ini fi } function check-packages { - if [[ $pks ]] + if [ "$pks" ] then return 0 else @@ -147,32 +139,31 @@ function apt-update { function apt-category { check-packages find-workspace - for pkg in "${pks[@]}" + for vas in "${pks[@]}" do awk ' $1 == "@" { pck = $2 } - $1 == "category:" && $0 ~ query { + $1 == "category:" && $0 ~ vas { print pck } - ' query="$pks" setup.ini + ' vas="$vas" setup.ini done } function apt-list { find-workspace - local sbq - for pkg in "${pks[@]}" + for vas in "${pks[@]}" do - (( sbq++ )) && echo - info Searching for installed packages matching "$pkg": - awk 'NR>1 && $1~ENVIRON["pkg"] && $0=$1' /etc/setup/installed.db + let sbq++ && echo + info Searching for installed packages matching "$vas": + awk 'NR>1 && $1~vas && $0=$1' vas="$vas" /etc/setup/installed.db echo - info Searching for installable packages matching "$pkg": - awk '$1 ~ ENVIRON["pkg"] && $0 = $1' RS='\n\n@ ' FS='\n' setup.ini + info Searching for installable packages matching "$vas": + awk '$1~vas && $0=$1' RS='\n\n@ ' FS='\n' vas="$vas" setup.ini done - (( sbq )) && return + let sbq && return info The following packages are installed: awk 'NR>1 && $0=$1' /etc/setup/installed.db } @@ -180,41 +171,40 @@ function apt-list { function apt-listfiles { check-packages find-workspace - local pkg sbq - for pkg in "${pks[@]}" + for vas in "${pks[@]}" do - (( sbq++ )) && echo - if [ ! -e /etc/setup/"$pkg".lst.gz ] + let sbq++ && echo + if [ ! -e /etc/setup/"$vas".lst.gz ] then - download "$pkg" + download || return fi - gzip -cd /etc/setup/"$pkg".lst.gz + gzip -cd /etc/setup/"$vas".lst.gz done } function apt-show { find-workspace check-packages - for pkg in "${pks[@]}" + for vas in "${pks[@]}" do - (( notfirst++ )) && echo + let sbq++ && echo awk ' - $1 == query { + $1 == vas { print fd++ } END { if (! fd) - print "Unable to locate package " query + print "Unable to locate package", vas } - ' RS='\n\n@ ' FS='\n' query="$pkg" setup.ini + ' RS='\n\n@ ' FS='\n' vas="$vas" setup.ini done } function apt-depends { find-workspace check-packages - for pkg in "${pks[@]}" + for vas in "${pks[@]}" do awk ' @include "join" @@ -226,7 +216,7 @@ function apt-depends { reqs[apg][z-1] = $z } END { - prpg(ENVIRON["pkg"]) + prpg(vas) } function smartmatch(small, large, values) { for (each in large) @@ -242,13 +232,14 @@ function apt-depends { prpg(reqs[fpg][each]) delete spath[length(spath)] } - ' setup.ini + ' vas="$vas" setup.ini done } function apt-rdepends { + check-packages find-workspace - for pkg in "${pks[@]}" + for vas in "${pks[@]}" do awk ' @include "join" @@ -260,7 +251,7 @@ function apt-rdepends { reqs[$z][length(reqs[$z])+1] = apg } END { - prpg(ENVIRON["pkg"]) + prpg(vas) } function smartmatch(small, large, values) { for (each in large) @@ -276,89 +267,77 @@ function apt-rdepends { prpg(reqs[fpg][each]) delete spath[length(spath)] } - ' setup.ini + ' vas="$vas" setup.ini done } function apt-download { check-packages find-workspace - local pkg sbq - for pkg in "${pks[@]}" + for vas in "${pks[@]}" do - (( sbq++ )) && echo - download "$pkg" + let sbq++ && echo + download done } function download { - local pkg digest digactual - pkg=$1 - # look for package and save desc file - - awk '$1 == pc' RS='\n\n@ ' FS='\n' pc=$pkg setup.ini > desc - if [ ! -s desc ] - then - echo Unable to locate package $pkg - exit 1 - fi + # look for package and save md5 file # download and unpack the bz2 or xz file # pick the latest version, which comes first - set -- $(awk '$1 == "install:"' desc) - if (( ! $# )) + awk ' + $1 == "@" { + c = $2 + } + $1 == "install:" && c == vas { + print $4, $2 + exit + } + ' vas="$vas" setup.ini > md5.sum + if [ ! -s md5.sum ] then - echo 'Could not find "install" in package description: obsolete package?' - exit 1 + warn Unable to locate package $vas + return 1 fi - dn=$(dirname $2) - bn=$(basename $2) + read _ acv < md5.sum # check the md5 - digest=$4 - mkdir -p $cache/$mirrordir/$dn - cd $cache/$mirrordir/$dn - if ! test -e $bn || ! md5sum -c <<< "$digest $bn" + mv md5.sum .. + cd .. + if ! test -e $acv || ! md5sum -c md5.sum then - wget -O $bn $mirror/$dn/$bn - md5sum -c <<< "$digest $bn" || exit + wget -rnH $mirror/$acv + md5sum -c md5.sum || return fi - tar tf $bn | gzip > /etc/setup/"$pkg".lst.gz - cd ~- - mv desc $cache/$mirrordir/$dn - echo $dn $bn > /tmp/dwn + tar tf $acv | gzip > /etc/setup/"$vas".lst.gz } function apt-search { - check-packages + check-packages || return echo Searching downloaded packages... - for pkg in "${pks[@]}" + for vas in "${pks[@]}" do - key=$(type -P "$pkg" | sed s./..) - [[ $key ]] || key=$pkg - for manifest in /etc/setup/*.lst.gz + for mft in /etc/setup/*.lst.gz do - if gzip -cd $manifest | grep -q "$key" + if gzip -cd $mft | grep -q "$vas" then - package=$(sed ' - s,/etc/setup/,, - s,.lst.gz,, - ' <<< $manifest) - echo $package + awk '$0=$4' FS='[./]' <<< $mft fi done done } function apt-searchall { - cd /tmp - for pkg in "${pks[@]}" + check-packages + cd /etc/setup + for vas in "${pks[@]}" do - printf -v qs 'text=1&arch=%s&grep=%s' $ARCH "$pkg" - wget -O matches cygwin.com/cgi-bin2/package-grep.cgi?"$qs" + printf -v qry 'text=1&arch=%s&grep=%s' $arch "$vas" + wget -O matches cygwin.com/cgi-bin2/package-grep.cgi?"$qry" awk ' { if (NR == 1) @@ -373,76 +352,105 @@ function apt-searchall { done } +function set-cache { + if [ "$1" ] + then + vas=$(cygpath -aw "$1") + awk -i inplace ' + 1 + /last-cache/ { + getline + print "\t" vas + } + ' vas="${vas//\\/\\\\}" /etc/setup/setup.rc + echo Cache set to "$vas" + else + warn No path provided, exiting + fi +} + +function set-mirror { + if [ "$1" ] + then + awk -i inplace ' + 1 + /last-mirror/ { + getline + print "\t" vas + } + ' vas="$1" /etc/setup/setup.rc + echo Mirror set to "$1" + else + warn No URL provided, exiting + fi +} + function apt-install { check-packages find-workspace - local pkg dn bn requires wr package sbq script - for pkg in "${pks[@]}" + for vas in "${pks[@]}" do - if grep -q "^$pkg " /etc/setup/installed.db + if grep -q "^$vas " /etc/setup/installed.db then - echo Package $pkg is already installed, skipping + echo Package $vas is already installed, skipping continue fi - (( sbq++ )) && echo - echo Installing $pkg + let sbq++ && echo + echo Installing $vas - download $pkg - read dn bn /tmp/awk.$$ - mv /etc/setup/installed.db /etc/setup/installed.db-save - mv /tmp/awk.$$ /etc/setup/installed.db + ' -i inplace vas="$vas" acv=$acv /etc/setup/installed.db # recursively install required packages - requires=$(awk '$1=="requires", $0=$2' FS=': ' desc) - cd ~- - wr=0 - if [[ $requires ]] - then - echo Package $pkg requires the following packages, installing: - echo $requires - for package in $requires - do - if grep -q "^$package " /etc/setup/installed.db - then - echo Package $package is already installed, skipping - continue - fi - apt-cyg install --noscripts $package || (( wr++ )) - done - fi - if (( wr )) + awk ' + $1 == "@" { + c = $2 + } + $1 == "requires:" && c == vas { + print + exit + } + ' vas="$vas" setup.ini > deps.ini + if [ -s deps.ini ] then + read _ rqs < deps.ini + echo Package $vas requires the following packages, installing: + echo $rqs + apt-cyg install --deps $rqs || info some required packages did not install, continuing fi # run all postinstall scripts - (( noscripts )) && continue + let dps && continue find /etc/postinstall -name '*.sh' | while read script do echo Running $script $script mv $script $script.done done - echo Package $pkg installed + echo Package $vas installed done } @@ -451,21 +459,21 @@ function apt-remove { check-packages cd /etc cygcheck awk bash bunzip2 grep gzip mv sed tar xz > setup/essential.lst - for pkg in "${pks[@]}" + for vas in "${pks[@]}" do - if ! grep -q "^$pkg " setup/installed.db + if ! grep -q "^$vas " setup/installed.db then - echo Package $pkg is not installed, skipping + echo Package $vas is not installed, skipping continue fi - if [ ! -e setup/"$pkg".lst.gz ] + if [ ! -e setup/"$vas".lst.gz ] then - warn Package manifest missing, cannot remove $pkg. Exiting - exit 1 + warn Package manifest missing, cannot remove $vas. Exiting + return 1 fi - gzip -dk setup/"$pkg".lst.gz + gzip -dk setup/"$vas".lst.gz awk ' NR == FNR { if ($NF) ess[$NF] @@ -474,126 +482,74 @@ function apt-remove { $NF in ess { exit 1 } - ' FS='[/\\\\]' setup/{essential,$pkg}.lst + ' FS='[/\\\\]' setup/{essential,$vas}.lst esn=$? if [ $esn = 0 ] then - echo Removing $pkg - if [ -e preremove/"$pkg".sh ] + echo Removing $vas + if [ -e preremove/"$vas".sh ] then - preremove/"$pkg".sh - rm preremove/"$pkg".sh + preremove/"$vas".sh + rm preremove/"$vas".sh fi - mapfile dt < setup/"$pkg".lst - for each in ${dt[*]} + mapfile mft < setup/"$vas".lst + for emt in ${mft[*]} do - [ -f /$each ] && rm /$each + [ -f /$emt ] && rm /$emt done - for each in ${dt[*]} + for emt in ${mft[*]} do - [ -d /$each ] && rmdir --i /$each + [ -d /$emt ] && rmdir --i /$emt done - rm -f setup/"$pkg".lst.gz postinstall/"$pkg".sh.done - awk -i inplace '$1 != ENVIRON["pkg"]' setup/installed.db - echo Package $pkg removed + rm -f setup/"$vas".lst.gz postinstall/"$vas".sh.done + awk -i inplace '$1 != vas' vas="$vas" setup/installed.db + echo Package $vas removed fi - rm setup/"$pkg".lst + rm setup/"$vas".lst if [ $esn = 1 ] then - warn apt-cyg cannot remove package $pkg, exiting - exit 1 + warn apt-cyg cannot remove package $vas, exiting + return 1 fi done } -if [ -p /dev/stdin ] -then - mapfile -t pks -fi +function begin { + local acv dps emt esn mft pks qry rqs sbq tsk vas arch cache mirror mirrordir + if [ -p /dev/stdin ] + then + mapfile -t pks + fi -# process options -while (( $# )) -do + # process options + while let $# + do case "$1" in - --mirror | -m) - awk -i inplace ' - 1 - /last-mirror/ { - getline - print "\t" rpc - } - ' rpc="$2" /etc/setup/setup.rc - shift 2 + --mirror) + set-mirror "$2" + return ;; - --cache | -c) - rpc=$(cygpath -aw "$2" | sed 's \\ \\\\ g') - awk -i inplace ' - 1 - /last-cache/ { - getline - print "\t" rpc - } - ' rpc="$rpc" /etc/setup/setup.rc - shift 2 + --cache) + set-cache "$2" + return ;; - --noscripts) - noscripts=1 + --deps) + dps=1 shift ;; - --help) - printf %s "${usage[@]}" - exit 0 - ;; - --version) printf %s "${version[@]}" - exit 0 + return ;; - --file | -f) - if [[ $2 ]] - then - mf=$2 - if [ -f "$mf" ] - then - mapfile -t pks < "$mf" - else - echo File "$mf" not found, skipping - fi - shift - else - info No file name provided, ignoring $1 - fi - shift - ;; - - update) - command=$1 - shift - ;; - - install \ - | remove \ - | download \ - | show \ - | depends \ - | rdepends \ - | list \ - | category \ - | listfiles \ - | search \ - | searchall) - if [[ $command ]] - then - pks+=("$1") - else - command=$1 - fi + list | remove | update | install | download | listfiles |\ + show | search | depends | category | rdepends | searchall ) + tsk=$1 shift ;; @@ -603,13 +559,25 @@ do ;; esac -done + done + if type -t apt-$tsk | grep -q function + then + readonly arch=${HOSTTYPE/i6/x} + apt-$tsk + else + printf %s "${usage[@]}" + fi +} -set -a +function charlie { + cd /etc/setup + compgen -v > $1.lst + if [ $1 = fin ] + then + comm -3 {start,fin}.lst + fi +} -if type -t apt-$command | grep -q function -then - apt-$command -else - printf %s "${usage[@]}" -fi +charlie start +begin "$@" +charlie fin