123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559 |
- #!/bin/bash
- #Copyright Barry Kauler, aug 2011, bkhome.org
- #110817 find all packages to be used in a Puppy build, pet and compat.
- #110821 must also work with working-dir set to /root/.packages
- #110908 fix o/p file for pkgs which genericname not found.
- #111014 tweak support for 3.x kernel.
- #111127 no longer check if host has 'printcols', 'vercmp', it is done in 'merge2out' script.
- #111127 syntax checking of db files is happening too much.
- #111128 checking fields 11,12,13 of db now much faster.
- #111204 do not use /var/local/woof, instead 'status' directory (better for running from different save-files).
- #111204 use md5sum for all checking whether to rerun this script.
- #120515 build from "gentoo" binary tarballs (refer support/gentoo).
- #120719 support raspbian.
- #120812 db category now allows optional subcategory (for which an icons exists in /usr/local/lib/X11/mini-icons).
- #121102 file DISTRO_SPECS has new variable DISTRO_DB_SUBNAME. ex: for 14.0-based slacko, DISTRO_DB_SUBNAME=slacko14
- #121102 pet_packages-${DISTRO_COMPAT_VERSION} (or pet_packages-${DISTRO_FILE_PREFIX}) is now pet_packages-${DISTRO_DB_SUBNAME.
- #130306 arch linux: gz now xz. maybe only 'DISTRO_COMPAT_REPOS-arch'.
- #130312 add wary5 fallback.
- #130313 having problem with repo-override. $PKGLOCFLD needs to be respected (ex: pet:wary5).
- #130316 fixed bug, getting duplicate :$GENERICNAME: in file FINAL_PKGS.
- #130320 fix disappearing pkg in FINAL_PKGS.
- #130320 get rid of |puppy|wary5| |t2|8.0rc| in fallbacks searching for pet.
- #130321 bring back |t2|8.0rc|
- #variable PKGS_SPECS_TABLE in file DISTRO_PKGS_SPECS-* to have optional values in 5th field:
- #yes|915resolution||exe,dev,doc,nls|[pet[:<repo>]] or yes|915resolution||exe,dev,doc,nls|[compat[:<repo>]]
- #exs: yes|915resolution||exe,dev,doc,nls|compat yes|915resolution|915resolution|exe,dev,doc,nls|compat:core
- #...'compat' means pkg from compatible-distro, 'core' is a specific repo, 3rd or 4rd field in 'Packages-mageia-1-core'
- #...3rd field is now optional for both pet/compat if 5th field present.
- #previously, a pet pkg is implied by empty 3rd field (and empty 5th), however now can have an optional name qualifier...
- #ex: yes|915resolution|915resolution-2011*|exe,dev,doc,nls|pet
- #...optional glob wildcard(s) in 3rd field, multiple parameters allowed (comma delimiters), '-' exclusion-prefix also.
- # PET pkgs: no need to specify _DEV, _DOC, _NLS, they are implied by 4th field.
- #if above is unclear, please read: http://bkhome.org/blog/?viewDetailed=02414
- export LANG=C #faster.
- CURDIR="`pwd`"
- if [ "$CURDIR" = "/root/.packages" ];then #110821
- . /etc/DISTRO_SPECS #has DISTRO_BINARY_COMPAT, DISTRO_COMPAT_VERSION
- [ ! "$DISTRO_DB_SUBNAME" ] && DISTRO_DB_SUBNAME="$DISTRO_COMPAT_VERSION" #121102 fallback if DISTRO_DB_SUBNAME not defined in file DISTRO_SPECS.
- #DS_DATE=`stat --format=%Y /etc/DISTRO_SPECS`
- DS_DATE="`md5sum /etc/DISTRO_SPECS | cut -f 1 -d ' '`"
- . ./DISTRO_PKGS_SPECS #has PKGS_SPECS_TABLE, FALLBACKS_COMPAT_VERSIONS
- . ./DISTRO_COMPAT_REPOS #v431 has PKG_DOCS_DISTRO_COMPAT
- #DPS_MODIFY_DATE=`stat --format=%Y ./DISTRO_PKGS_SPECS` #modify date, seconds since last epoch.
- DPS_MODIFY_DATE="`md5sum ./DISTRO_PKGS_SPECS | cut -f 1 -d ' '`"
- else
- . ./DISTRO_SPECS #has DISTRO_BINARY_COMPAT, DISTRO_COMPAT_VERSION
- [ ! "$DISTRO_DB_SUBNAME" ] && DISTRO_DB_SUBNAME="$DISTRO_COMPAT_VERSION" #121102 fallback if DISTRO_DB_SUBNAME not defined in file DISTRO_SPECS.
- #DS_DATE=`stat --format=%Y ./DISTRO_SPECS`
- DS_DATE="`md5sum ./DISTRO_SPECS | cut -f 1 -d ' '`"
- if [ -f ./DISTRO_COMPAT_REPOS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION} ];then
- . ./DISTRO_COMPAT_REPOS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION}
- else
- . ./DISTRO_COMPAT_REPOS-${DISTRO_BINARY_COMPAT} #130306
- fi
- if [ -f ./DISTRO_PKGS_SPECS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION} ];then
- . ./DISTRO_PKGS_SPECS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION} #has FALLBACKS_COMPAT_VERSIONS
- #DPS_MODIFY_DATE=`stat --format=%Y ./DISTRO_PKGS_SPECS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION}` #modify date, seconds since last epoch.
- DPS_MODIFY_DATE="`md5sum ./DISTRO_PKGS_SPECS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION} | cut -f 1 -d ' '`"
- else
- . ./DISTRO_PKGS_SPECS-${DISTRO_BINARY_COMPAT} #has FALLBACKS_COMPAT_VERSIONS
- #DPS_MODIFY_DATE=`stat --format=%Y ./DISTRO_PKGS_SPECS-${DISTRO_BINARY_COMPAT}` #modify date, seconds since last epoch.
- DPS_MODIFY_DATE="`md5sum ./DISTRO_PKGS_SPECS-${DISTRO_BINARY_COMPAT} | cut -f 1 -d ' '`"
- fi
- fi
- . ./DISTRO_PET_REPOS #has PET_REPOS, PACKAGELISTS_PET_ORDER
- . ./PKGS_MANAGEMENT #has PKG_NAME_ALIASES
- . ./WOOFMERGEVARS #111127 need to know if a cross-build.
- #variable DISTRO_KERNEL_PET is in file DISTRO_SPECS... ex: linux_kernel-2.6.32-44-i486-w5.pet 111014 remove if-then...
- KERNMAJ="`echo -n "$DISTRO_KERNEL_PET" | cut -f 2 -d '-' | cut -f 1 -d '.'`" #2 or 3
- #if [ "$KERNMAJ" = "3" ];then
- # KERNELVER3="`echo -n "$DISTRO_KERNEL_PET" | cut -f 2 -d '-' | cut -f 1,2 -d '.' | cut -f 1 -d '_'`" #ex: 3.1
- #else
- KERNELVER3="`echo -n "$DISTRO_KERNEL_PET" | cut -f 2 -d '-' | cut -f 1,2,3 -d '.' | cut -f 1 -d '_'`" #ex: 2.6.32
- #fi
- #modify compat-distro fallback list...
- if [ "$FALLBACKS_COMPAT_VERSIONS" != "" ];then
- FALLBACKS_COMPAT_VERSIONS="`echo -n "$FALLBACKS_COMPAT_VERSIONS" | grep -o "${DISTRO_COMPAT_VERSION}.*"`"
- #ex: 'koala jaunty intrepid' gets reduced to 'jaunty intrepid' if DISTRO_COMPAT_VERSION=jaunty
- fi
- REPO_DEFAULT_SUBDIR="pet_packages-${DISTRO_DB_SUBNAME}" #121102
- BINARIES='deb' #get them from packages-deb.
- [ "$DISTRO_BINARY_COMPAT" = "t2" ] && BINARIES="bz2" #get them from packages-bz2-${DISTRO_COMPAT_VERSION}.
- [ "$DISTRO_BINARY_COMPAT" = "slackware" ] && BINARIES="tgz_txz" #download to packages-tgz_txz-${DISTRO_COMPAT_VERSION}.
- [ "$DISTRO_BINARY_COMPAT" = "debian" ] && BINARIES="deb" #download to packages-deb-${DISTRO_COMPAT_VERSION}.
- [ "$DISTRO_BINARY_COMPAT" = "arch" ] && BINARIES="tar_xz" #download to packages-tar_xz-${DISTRO_COMPAT_VERSION}. 130306
- [ "$DISTRO_BINARY_COMPAT" = "puppy" ] && BINARIES="pet" #built entirely from pet pkgs.
- [ "$DISTRO_BINARY_COMPAT" = "scientific" ] && BINARIES="rpm" #Iguleder: download to packages-rpm-${DISTRO_COMPAT_VERSION}.
- [ "$DISTRO_BINARY_COMPAT" = "mageia" ] && BINARIES="rpm"
- [ "$DISTRO_BINARY_COMPAT" = "gentoo" ] && BINARIES="gentoo" #120515 download to packages-gentoo-gap6
- [ "$DISTRO_BINARY_COMPAT" = "raspbian" ] && BINARIES="deb_raspbian" #download to packages-deb_raspbian-${DISTRO_COMPAT_VERSION}.
- BINARIES="${BINARIES}-${DISTRO_COMPAT_VERSION}"
- #the files that have compatible-distro pkg docs (these were downloaded by 0setup)...
- PKGLISTS_COMPAT="`echo "$PKG_DOCS_DISTRO_COMPAT" | tr ' ' '\n' | cut -f 3 -d '|' | tr '\n' ' '`" #see file DISTRO_PKGS_SPECS-ubuntu
- #...format ex: 'Packages-ubuntu-intrepid-main Packages-ubuntu-intrepid-universe'
- CURRDIR="`pwd`"
- #[ ! -d packages-templates ] && exit 1 #precaution.
- mkdir -p status
- STATUSDIR="${CURRDIR}/status"
- #for efficiency, only run this script if have too... 111204 use md5sum instead of date...
- KEEPGOING='no'
- for ADBFILE in $PACKAGELISTS_PET_ORDER $PKGLISTS_COMPAT
- do
- #NEWDATE=`stat --format=%Y $ADBFILE`
- NEWDATE="`md5sum $ADBFILE | cut -f 1 -d ' '`"
- OLDDATE="0"
- [ -f ${STATUSDIR}/MODIFY_DATE_${ADBFILE} ] && OLDDATE="`cat ${STATUSDIR}/MODIFY_DATE_${ADBFILE}`"
- if [ "$NEWDATE" != "$OLDDATE" ];then
- KEEPGOING='yes'
- #echo -n "$NEWDATE" > ${STATUSDIR}/MODIFY_DATE_${ADBFILE} #no, this is done below.
- fi
- # cache the columns used during package search
- if [ "$KEEPGOING" = "yes" ] || [ ! -f $STATUSDIR/$ADBFILE-cols ];then
- printcols ./${ADBFILE} 2 3 8 9 11 12 > $STATUSDIR/$ADBFILE-cols
- fi
- done
- OLD_DPS_DATE="0"
- [ -f ${STATUSDIR}/findpkgs_DPS_MODIFY_DATE-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION} ] && OLD_DPS_DATE="`cat ${STATUSDIR}/findpkgs_DPS_MODIFY_DATE-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION}`"
- if [ "$DPS_MODIFY_DATE" != "$OLD_DPS_DATE" ];then
- KEEPGOING='yes'
- echo -n "${DPS_MODIFY_DATE}" > ${STATUSDIR}/findpkgs_DPS_MODIFY_DATE-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION}
- fi
- OLD_DS_DATE="0"
- [ -f ${STATUSDIR}/findpkgs_MODIFY_DATE_DISTRO_SPECS ] && OLD_DS_DATE="`cat ${STATUSDIR}/findpkgs_MODIFY_DATE_DISTRO_SPECS`"
- if [ "$DS_DATE" != "$OLD_DS_DATE" ];then
- KEEPGOING='yes'
- echo -n "$DS_DATE" > ${STATUSDIR}/findpkgs_MODIFY_DATE_DISTRO_SPECS
- fi
- [ ! -f ${STATUSDIR}/findpkgs_FINAL_PKGS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION} ] && KEEPGOING='yes'
- if [ "$KEEPGOING" != "yes" ];then
- echo
- echo "Exiting from support/findpkgs, already created up-to-date pkg list:"
- echo " ${STATUSDIR}/findpkgs_FINAL_PKGS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION}"
- echo
- exit 0
- fi
- rm -rf /tmp/findpkgs_tmp 2>/dev/null
- mkdir /tmp/findpkgs_tmp
- #remove comments from PKGS_SPECS_TABLE... make sure '|' on end... get rid of old |+udev,+whatever on end...
- PKGS_SPECS_TABLE="`echo "$PKGS_SPECS_TABLE" | grep -v '^#' | grep -v '^$' | tr '\t' ' ' | tr -s ' ' | tr '+' '&' | sed -e 's%|&.*%%' | tr '&' '+' | sed -e 's% #.*%%' -e 's% $%%' -e 's%$%|%' -e 's%||$%|%'`"
- echo
- echo "Checking syntax of PKGS_SPECS_TABLE..."
- CNT=1
- for ONECHK in $PKGS_SPECS_TABLE
- do
- BADFLAG='no'
- NUMDELS=`echo "$ONECHK" | sed -e 's/[^|]//g' | wc -c`
- [ $NUMDELS -lt 4 -o $NUMDELS -gt 6 ] && BADFLAG='yes'
- YESNO="`echo "$ONECHK" | cut -f 1 -d '|' | grep -E 'yes|no'`"
- [ "YESNO" = "" ] && BADFLAG='yes'
- GENPKG="`echo "$ONECHK" | cut -f 2 -d '|'`"
- [ "$GENPKG" = "" ] && BADFLAG='yes'
- if [ "$BADFLAG" = "yes" ];then
- echo "SYNTAX ERROR LINE ${CNT}: '$ONECHK'"
- echo "$PKGS_SPECS_TABLE" > /tmp/pst-dump
- exit 1
- fi
- CNT=$(($CNT + 1))
- done
- echo -n "" > /tmp/findpkgs_tmp/pet_log1
- echo -n "" > /tmp/findpkgs_tmp/compat_log1
- echo -n "" > /tmp/findpkgs_tmp/PREFERRED_PKGS
- echo -n "" > /tmp/findpkgs_tmp/FINAL_PKGS
- #compiledPTNS is to select a pkg that most closely matches the compile-environment of the compat-distro...
- #||| means architecture-independent pkg, needs high preference, immediately after exact-compiled match...
- petcompiledPTNS="|${DISTRO_BINARY_COMPAT}|${DISTRO_COMPAT_VERSION}| |||" #ex: '|ubuntu|intrepid|' '|||'
- for ONECOMPATVERSION in $FALLBACKS_COMPAT_VERSIONS #sliding scale, ex: koala jaunty intrepid
- do
- [ "$ONECOMPATVERSION" = "$DISTRO_COMPAT_VERSION" ] && continue
- [ "$ONECOMPATVERSION" = "4" ] && break #bottom of ladder, drop down to |puppy| test only. (i have some |puppy| in common repo, want to find them before |puppy|4|)
- petcompiledPTNS="${petcompiledPTNS} |${DISTRO_BINARY_COMPAT}|${ONECOMPATVERSION}|"
- done
- #need hack, older quirky pkgs compiled with |t2|8.0rc| and have some of these in common repo...
- #130320 get rid of |puppy|wary5| |t2|8.0rc| ... 130321 bring back |t2|8.0rc| ...
- if [ "$DISTRO_BINARY_COMPAT" = "puppy" ];then
- petcompiledPTNS="${petcompiledPTNS} |t2|8.0rc| |puppy| |" #increasingly desperate. last one will find any pkg with matching name. 130312 add wary5.
- else
- petcompiledPTNS="${petcompiledPTNS} |${DISTRO_BINARY_COMPAT}| |t2|8.0rc| |puppy| |" #increasingly desperate. 130312 add wary5.
- fi
- ##111127 this code block is running too many times. the most likely situation is when db files for a compat-distro
- ##are created by 0setup/1download and the last two/three fields are left out. just check first line of db...
- ##problem with ||| above high priority, compileddistro|compiledrelease| are optional fields and may be missing.
- ##printcols <file> 2 3 8 9 11 12 (see below) does insert 11 & 12 delimiters if missing, but that would bump the
- ##priority of that pkg -- results in pkgs in Packages-puppy-4-official getting chosen.
- #for ADBFILE in $PACKAGELISTS_PET_ORDER $PKGLISTS_COMPAT
- #do
- # NEWDATE=`stat --format=%Y $ADBFILE` #seconds since last epoch.
- # OLDDATE=0
- # [ -f ${STATUSDIR}/MODIFY_DATE_${ADBFILE} ] && OLDDATE=`cat ${STATUSDIR}/MODIFY_DATE_${ADBFILE}`
- # if [ $NEWDATE -ne $OLDDATE ];then
- # #if ! vercmp "$NEWDATE" eq "$OLDDATE";then
- # echo "Fixing compileddistro|compiledrelease| fields in $ADBFILE"
- # echo -n "" > /tmp/findpkgs_tmp/dbfilefixed
- # DB_compileddistro="`echo -n "$ADBFILE" | cut -f 2 -d '-'`" #ex: puppy
- # DB_compiledrelease="`echo -n "$ADBFILE" | cut -f 3 -d '-'`" #ex: 4
- # DB_repo="`echo -n "$ADBFILE" | cut -f 4 -d '-'`" #ex: official
- # #db fields: pkgname|nameonly|version|pkgrelease|category|size|path|fullfilename|dependencies|description|compileddistro|compiledrelease|repo|
- # cat $ADBFILE |
- # while read ONELINE
- # do
- # echo -n "."
- # DELNUM=`echo -n "$ONELINE" | sed -e 's%[^|]%%g' | wc -c` #number of | delimiters.
- # case $DELNUM in
- # 10) echo "${ONELINE}${DB_compileddistro}|${DB_compiledrelease}||" >> /tmp/findpkgs_tmp/dbfilefixed ;;
- # 9) echo "|${ONELINE}${DB_compileddistro}|${DB_compiledrelease}||" >> /tmp/findpkgs_tmp/dbfilefixed ;; #broken, missing | on end of description.
- # *)
- # #echo "$ONELINE" >> /tmp/findpkgs_tmp/dbfilefixed
- # #111127 mark entire file as ok, get out (see note above)...
- # NEWDATE=`stat --format=%Y $ADBFILE` #seconds since last epoch.
- # echo -n "$NEWDATE" > ${STATUSDIR}/MODIFY_DATE_${ADBFILE}
- # continue 2
- # ;;
- # esac
- # done
- # sync
- # echo
- # mv -f $ADBFILE /tmp/findpkgs_tmp/${ADBFILE}-PREVIOUS
- # #mv -f /tmp/findpkgs_tmp/dbfilefixed $ADBFILE
- # #Packages-puppy-slacko-official has some duplicate entries, cleanup...
- # sort -u --key=1,1 --field-separator="|" /tmp/findpkgs_tmp/dbfilefixed > ${ADBFILE}
- # NEWDATE=`stat --format=%Y $ADBFILE` #seconds since last epoch.
- # echo -n "$NEWDATE" > ${STATUSDIR}/MODIFY_DATE_${ADBFILE}
- # fi
- #done
- #111128 redo the above, much faster...
- #problem with ||| above high priority, compileddistro|compiledrelease| are optional fields and may be missing.
- #printcols <file> 2 3 8 9 11 12 (see below) does insert 11 & 12 delimiters if missing, but that would bump the
- #priority of that pkg -- results in pkgs in Packages-puppy-4-official getting chosen.
- for ADBFILE in $PACKAGELISTS_PET_ORDER $PKGLISTS_COMPAT
- do
- NEWSUM="`md5sum $ADBFILE | cut -f 1 -d ' '`"
- OLDSUM="0"
- [ -f ${STATUSDIR}/MODIFY_DATE_${ADBFILE} ] && OLDSUM="`cat ${STATUSDIR}/MODIFY_DATE_${ADBFILE}`"
- if [ "$NEWSUM" != "$OLDSUM" ];then
- DB_compileddistro="`echo -n "$ADBFILE" | cut -f 2 -d '-'`" #ex: puppy
- DB_compiledrelease="`echo -n "$ADBFILE" | cut -f 3 -d '-'`" #ex: 4
- DB_repo="`echo -n "$ADBFILE" | cut -f 4 -d '-'`" #ex: official
- #db fields: pkgname|nameonly|version|pkgrelease|category[;subcategory]|size|path|fullfilename|dependencies|description|compileddistro|compiledrelease|repo|
- echo "Fixing compileddistro|compiledrelease| fields in $ADBFILE"
- FIELD11PTN="s%VERTBARCHAR$%VERTBARCHAR${DB_compileddistro}VERTBARCHAR%"
- FIELD12PTN="s%VERTBARCHAR$%VERTBARCHAR${DB_compiledrelease}VERTBARCHAR%"
- sed -e 's%|%VERTBARCHAR%' -e 's%|%VERTBARCHAR%' -e 's%|%VERTBARCHAR%' -e 's%|%VERTBARCHAR%' -e 's%|%VERTBARCHAR%' -e 's%|%VERTBARCHAR%' -e 's%|%VERTBARCHAR%' -e 's%|%VERTBARCHAR%' -e 's%|%VERTBARCHAR%' -e 's%|%VERTBARCHAR%' -e "${FIELD11PTN}" -e "${FIELD12PTN}" -e 's%VERTBARCHAR$%VERTBARCHARVERTBARCHAR%' -e 's%\(VERTBARCHAR[^|]*|[^|]*|$\)%\1|%' -e 's%VERTBARCHAR%|%g' ${ADBFILE} > /tmp/findpkgs_tmp/dbfilefixed
- REALNEWSUM="`md5sum /tmp/findpkgs_tmp/dbfilefixed | cut -f 1 -d ' '`"
- if [ "$REALNEWSUM" != "$NEWSUM" ];then
- cp -f /tmp/findpkgs_tmp/dbfilefixed $ADBFILE
- NEWSUM="$REALNEWSUM"
- fi
- echo -n "$NEWSUM" > ${STATUSDIR}/MODIFY_DATE_${ADBFILE}
- fi
- done
- ##################
- ###FIRST SEARCH###
- ##################
- echo
- echo "First pass at finding packages to be used in the Puppy build..."
- search_func() {
- SEARCHNUM="$1"
- for ONEPKGSPEC in $PKGS_SPECS_TABLE
- do
- [ "$ONEPKGSPEC" = "" ] && continue
- YESNO="`echo "$ONEPKGSPEC" | cut -f 1 -d '|'`"
- [ "$YESNO" = "no" ] && continue
- GENERICNAME="`echo "$ONEPKGSPEC" | cut -f 2 -d '|'`"
- BINARYPARTNAMES="`echo "$ONEPKGSPEC" | cut -f 3 -d '|' | tr ',' ' '`"
- if [ "$BINARYPARTNAMES" = "" ];then
- xBINARYPARTNAMES="$GENERICNAME"
- else
- #cut out any to be excluded ( '-' prefix)...
- BINARYEXCLUDED0="`echo "$BINARYPARTNAMES" | tr ' ' '\n' | grep '^-' | sed -e 's/^-//'`"
- xBINARYPARTNAMES="`echo "$BINARYPARTNAMES" | tr ' ' '\n' | grep -v '^-' | tr '\n' ' '`"
- fi
- echo -n "" > /tmp/findpkgs_tmp/excludePTNS
- if [ "$BINARYEXCLUDED0" ];then
- excludePTNS="`echo -n "$BINARYEXCLUDED0" | sed -e 's%\\-%\\\\-%g' -e 's%\\*%.*%g' -e 's%^%|%'`" #i think that dashes need to be backslashed, change blob * wildcard to reg.expr.
- echo "$excludePTNS" > /tmp/findpkgs_tmp/excludePTNS
- fi
- PKGLOC2=''; PKGLOC1='pet' #original behaviour
- [ "$BINARYPARTNAMES" != "" ] && PKGLOC1='compat' #original behaviour
- PKGLOCFLD="`echo "$ONEPKGSPEC" | cut -f 5 -d '|'`"
- if [ "$PKGLOCFLD" ];then
- PKGLOC1="`echo -n "$PKGLOCFLD" | cut -f 1 -d ':'`"
- [ "`echo -n "$PKGLOCFLD" | grep ':'`" != "" ] && PKGLOC2="`echo -n "$PKGLOCFLD" | cut -f 2 -d ':'`"
- fi
- if [ "$PKGLOC1" = "pet" ];then
- PACKAGELISTS_ORDER="$PACKAGELISTS_PET_ORDER"
- xPACKAGELISTS_ORDER="$PACKAGELISTS_PET_ORDER"
- compiledPTNS="$petcompiledPTNS"
- else
- PACKAGELISTS_ORDER="$PKGLISTS_COMPAT"
- xPACKAGELISTS_ORDER="$PKGLISTS_COMPAT"
- compiledPTNS='.' #allow everything through.
- fi
- if [ "$PKGLOC2" ];then #exs: core, nonfree, contrib, official (4th field in Packages-puppy-wary5-official)
- locPTN="\-${PKGLOC2}$"
- xPACKAGELISTS_ORDER="`echo -n "$PACKAGELISTS_ORDER" | tr -s ' ' | tr ' ' '\n' | grep "$locPTN" | tr '\n' ' '`"
- if [ ! "$xPACKAGELISTS_ORDER" ];then
- locPTN="\-${PKGLOC2}\-" #allow choose 3rd field also -wary5-
- xPACKAGELISTS_ORDER="`echo -n "$PACKAGELISTS_ORDER" | tr -s ' ' | tr ' ' '\n' | grep "$locPTN" | tr '\n' ' '`"
- fi
- fi
- echo -n "$GENERICNAME "
-
- for APARTNAME in $xBINARYPARTNAMES
- do
-
- #APARTNAME could have glob wildcard(s)...
- if [ "`echo -n "$APARTNAME" | grep '\\*$'`" != "" ];then #if has '*' on end, then look in full pkg name.
- namePTN="|`echo -n "$APARTNAME" | sed -e 's%\\-%\\\\-%g' -e 's%\\*%.*%g'`|" #i think that dashes need to be backslashed, change blob * wildcard to reg.expr.
- else
- namePTN="^`echo -n "$APARTNAME" | sed -e 's%\\-%\\\\-%g' -e 's%\\*%.*%g'`|" #i think that dashes need to be backslashed, change blob * wildcard to reg.expr.
- fi
- #in wary, i have many pkgs that are _DEV only, need to find these, a hack fix to find most...
- devnamePTN="`echo -n "$namePTN" | sed -e 's%|$%_DEV|%'`"
-
- echo -n "" > /tmp/findpkgs_tmp/FNDSPECS
- for acompiledPTN in $compiledPTNS
- do
- for PKGLIST in $xPACKAGELISTS_ORDER #ex: Packages-puppy-drake-official Packages-puppy-common-official Packages-puppy-4-official
- do
- #2 3 8 9 11 12 is: nameonly version fullpkgname dependencies compileddistro compiledrelease
- FNDSPECS="`grep "$namePTN" $STATUSDIR/$PKGLIST-cols | grep "$acompiledPTN" | grep -v -f /tmp/findpkgs_tmp/excludePTNS`" #note, no 'head -n 1'
- #in wary, i have many pkgs that are _DEV only, need to find these, a hack fix to find most...
- [ ! "$FNDSPECS" ] && FNDSPECS="`grep "$devnamePTN" $STATUSDIR/$PKGLIST-cols | grep "$acompiledPTN" | grep -v -f /tmp/findpkgs_tmp/excludePTNS`" #note, no 'head -n 1'
- if [ "$FNDSPECS" ];then
- for ONESPEC in $FNDSPECS #maybe more than one find.
- do
- echo "${ONESPEC}${PKGLIST}" >> /tmp/findpkgs_tmp/FNDSPECS #ex: abiword|2.3.4|abiword-2.3.4.pet|+gtk+|puppy|wary5|Packages-puppy-wary5-official
- done
- fi
- [ -s /tmp/findpkgs_tmp/FNDSPECS ] && break 2 #pkg(s) found.
- done
- done
- if [ ! -s /tmp/findpkgs_tmp/FNDSPECS ];then
- echo "WARNING: $APARTNAME pkg was not found!"
- continue
- fi
-
- for ONESPEC in `cat /tmp/findpkgs_tmp/FNDSPECS | tr '\n' ' '` #maybe more than one pkg found.
- do
- if [ "$SEARCHNUM" = "2" ];then #second search.
-
- #if there is a preferred pkg (after versioned-dep checking in this script) use that instead...
- if [ -s /tmp/findpkgs_tmp/PREFERRED_PKGS ];then
- if [ "$PKGLOCFLD" = "" ];then #130313 see also below. need to respect repo-override, even if a preferred version logged.
- fndnamePTN="^`echo -n "$ONESPEC" | cut -f 1 -d '|'`|" #ex: ^abiword|
- PREFSPEC="`grep "$fndnamePTN" /tmp/findpkgs_tmp/PREFERRED_PKGS`"
- [ "$PREFSPEC" ] && ONESPEC="$PREFSPEC"
- fi
- fi
- fndnamePTN="|`echo -n "$ONESPEC" | cut -f 1 -d '|'`|" #ex: |abiword|
- versionPTN="|`echo -n "$ONESPEC" | cut -f 2 -d '|'`|" #ex: |2.3.4|
- fullnamePTN="|`echo -n "$ONESPEC" | cut -f 3 -d '|'`|" #ex: |abiword-2.3.4.pet|
- REPODBFILE="`echo -n "$ONESPEC" | grep -o '|Packages-[^|]*' | cut -f 2 -d '|'`"
- #FULLDBENTRY="`grep "$fullnamePTN" $REPODBFILE`"
-
- #log the complete db entry, prefixed with generic-name, pet/compat and repo db filename...
- devnamePTN="|`echo -n "$ONESPEC" | cut -f 1 -d '|'`_DEV|" #ex: |abiword_DEV|
- docnamePTN="|`echo -n "$ONESPEC" | cut -f 1 -d '|'`_DOC|" #ex: |abiword_DOC|
- nlsnamePTN="|`echo -n "$ONESPEC" | cut -f 1 -d '|'`_NLS|" #ex: |abiword_NLS|
- for onePTN in $fndnamePTN $devnamePTN $docnamePTN $nlsnamePTN
- do
- FULLDBENTRY="`grep "$onePTN" $REPODBFILE | grep "$versionPTN"`"
- if [ "$FULLDBENTRY" ];then
- #130313 i think this is where having problem. a repo-override $PKGLOCFLD needs to be respected (ex: pet:wary5)...
- if [ "$PKGLOCFLD" ];then
- EXISTENTRY="`grep "$onePTN" /tmp/findpkgs_tmp/FINAL_PKGS | grep "$REPODBFILE"`"
- else
- EXISTENTRY="`grep "$onePTN" /tmp/findpkgs_tmp/FINAL_PKGS`" #previous code.
- fi
- if [ "$EXISTENTRY" = "" ];then
- echo ":${GENERICNAME}:|${PKGLOC1}|${REPODBFILE}|${FULLDBENTRY}" >> /tmp/findpkgs_tmp/FINAL_PKGS #ex: :a52dec:|compat|Packages-puppy-wary5-official|a52dec-0.7.4-w5|a52dec|0.7.4-w5||BuildingBlock|68K||a52dec-0.7.4-w5.pet||A free ATSC A52 stream decoder|puppy|wary5||
- else
- grep -v "$onePTN" /tmp/findpkgs_tmp/FINAL_PKGS > /tmp/findpkgs_tmp/FINAL_PKGS2
- mv -f /tmp/findpkgs_tmp/FINAL_PKGS2 /tmp/findpkgs_tmp/FINAL_PKGS
- #130316 in arch build getting duplicate generic names, ex:
- # :cups::cups:|pet|Packages-puppy-wary5-official|cups_DEV-1.4.8-w5c|cups_DEV|1.4.8-w5c||BuildingBlock|216K||cups_DEV-1.4.8-w5c.pet|+cups|common unix printing system|puppy|wary5||
- gnPTN1=':'"${GENERICNAME}"'[:|]'
- if [ "$(echo -n "${EXISTENTRY}" | grep "${gnPTN1}")" = "" ];then
- echo ":${GENERICNAME}:${EXISTENTRY}" >> /tmp/findpkgs_tmp/FINAL_PKGS #ex: :audio::a52dec:|compat|Packages-puppy-wary5-official|a52dec-0.7.4-w5|a52dec|0.7.4-w5||BuildingBlock|68K||a52dec-0.7.4-w5.pet||A free ATSC A52 stream decoder|puppy|wary5||
- else #130320 fix disappearing pkg.
- echo "${EXISTENTRY}" >> /tmp/findpkgs_tmp/FINAL_PKGS #ex: :audio::a52dec:|compat|Packages-puppy-wary5-official|a52dec-0.7.4-w5|a52dec|0.7.4-w5||BuildingBlock|68K||a52dec-0.7.4-w5.pet||A free ATSC A52 stream decoder|puppy|wary5||
- fi
- fi
- fi
- done
-
- else #1st search
- VERDEPS="`echo -n "$ONESPEC" | cut -f 4 -d '|' | tr ',' '\n' | sed -e 's%^+%%'`" #field-4 is dependencies.
- if [ "$VERDEPS" = "" ];then
- echo "`echo -n "${ONESPEC}" | cut -f 1,2,3,5,6,7 -d '|'`|" >> /tmp/findpkgs_tmp/${PKGLOC1}_log1 #ex: abiword|2.3.4|abiword-2.3.4-w5.pet|puppy|wary5|Packages-puppy-wary5-official|
- else
- for ONEVERDEP in `echo -n "${VERDEPS}" | tr '\n' ' '` #create one line for each dep.
- do
- echo "`echo -n "${ONESPEC}" | cut -f 1,2,3,5,6,7 -d '|'`|${ONEVERDEP}" >> /tmp/findpkgs_tmp/${PKGLOC1}_log1 #ex: abiword|2.3.4|abiword-2.3.4-w5.pet|puppy|wary5|Packages-puppy-wary5-official|aiksaurus>5.6.7
- done
- fi
- fi
- done
- done
- done
- } #end search_func
- search_func 1 #first search.
- sync
- #####################
- ###POST PROCESSING###
- #####################
- #append dummy linux_kernel line...
- echo "linux_kernel|${KERNELVER3}|linux_kernel-${KERNELVER3}.pet|||" >> /tmp/findpkgs_tmp/pet_log1
- #don't forget, need read aliases for deps, variable PKG_NAME_ALIASES in file PKGS_MANAGEMENT...
- #want to handle multiple conditions ex: aiksaurus>5.6.7<5.7.8
- echo
- echo
- echo "Processing dependencies..."
- echo -n "" > /tmp/findpkgs_tmp/fnd_ok_deps
- echo -n "" > /tmp/findpkgs_tmp/fnd_ok_apps
- for ONESPEC in `cat /tmp/findpkgs_tmp/compat_log1 /tmp/findpkgs_tmp/pet_log1 | grep '&' | tr '\n' ' '`
- do
- #ex: ONESPEC=abiword|2.3.4|abiword-2.3.4-w5.pet|puppy|wary5|Packages-puppy-wary5-official|aiksaurus>5.6.7
- appPTN="^`echo -n "$ONESPEC" | cut -f 1 -d '|'`|" #pattern of the application name ex: ^abiword|
- appVER="`echo -n "$ONESPEC" | cut -f 2 -d '|'`" #ex: 2.3.4
- DEPFLD="`echo -n "$ONESPEC" | cut -f 7 -d '|'`"
- DEPNAME="`echo -n "$DEPFLD" | cut -f 1 -d '&'`"
- DEPCONDS="`echo -n "$DEPFLD" | cut -f 2-9 -d '&' | tr '&' ' '`"
- depnamePTN="|${DEPNAME}|"
- echo -n "$DEPNAME "
-
- #handle aliases...
- aliasesPTNS="`echo "$PKG_NAME_ALIASES" | tr ' ' '\n' | grep -v '^$' | sed -e 's%^%|%' -e 's%$%|%' -e 's%,%|,|%g' -e 's%\\*%.*%g'`"
- #ex: PKG_NAME_ALIASES has an entry cxxlibs,glibc*,libc-* the above creates |cxxlibs|,|glibc.*|,|libc\-.*|
- echo "$aliasesPTNS" > /tmp/findpkgs_tmp/aliasesPTNS
- singlePTNS="`echo "$aliasesPTNS" | tr ',' '\n'`"
- echo "$singlePTNS" > /tmp/findpkgs_tmp/singlePTNS
- FNDALIAS="`echo -n "$depnamePTN" | grep -f /tmp/findpkgs_tmp/singlePTNS | sed -e 's%\\.\\*%*%g' -e 's%\\\\-%-%g'`" #translate .* \- back to * -
- if [ "$FNDALIAS" ];then
- aliasPTNS="`echo -n "$FNDALIAS" | grep -f /tmp/findpkgs_tmp/aliasesPTNS | tr ',' ' '`" #ex: |cxxlibs| |glibc.*| |libc\-.*|
- else
- aliasPTNS="^${DEPNAME}|"
- fi
- for namePTN in $aliasPTNS
- do
- for FNDPKG in `cat /tmp/findpkgs_tmp/compat_log1 /tmp/findpkgs_tmp/pet_log1 | grep "$namePTN" | tr '\n' ' '`
- do
- #found a dependency, now check its version is ok...
- FNDVER="`echo -n "$FNDPKG" | cut -f 2 -d '|'`"
- condFLG='good'
- for ACOND in $DEPCONDS #ex: gt5.6.7 lt6.7.8
- do
- DEPOP="`echo -n "$ACOND" | cut -c 1,2`"
- DEPVER="`echo -n "$ACOND" | cut -c 3-99`"
- if ! vercmp ${FNDVER} ${DEPOP} ${DEPVER};then
- condFLG='bad'
- fi
- done
- [ "$condFLG" = "bad" ] && continue
-
- #version is ok.
- #log dep info, make sure only latest version is logged...
- depVERprev="`grep "$namePTN" /tmp/findpkgs_tmp/fnd_ok_deps | cut -f 2 -d '|'`"
- if [ "$depVERprev" = "" ];then
- echo "$FNDPKG" >> /tmp/findpkgs_tmp/fnd_ok_deps
- else
- if vercmp ${FNDVER} gt ${depVERprev};then
- grep -v "$namePTN" /tmp/findpkgs_tmp/fnd_ok_deps > /tmp/findpkgs_tmp/fnd_ok_deps2
- mv -f /tmp/findpkgs_tmp/fnd_ok_deps2 /tmp/findpkgs_tmp/fnd_ok_deps
- echo "$FNDPKG" >> /tmp/findpkgs_tmp/fnd_ok_deps
- fi
- fi
- #log actual pkg info as well as deps, make sure latest version logged...
- appVERprev="`grep "$appPTN" /tmp/findpkgs_tmp/fnd_ok_apps | cut -f 2 -d '|'`"
- if [ "$appVERprev" = "" ];then
- echo "$ONESPEC" >> /tmp/findpkgs_tmp/fnd_ok_apps
- else
- if vercmp ${appVER} gt ${appVERprev};then
- grep -v "$appPTN" /tmp/findpkgs_tmp/fnd_ok_apps > /tmp/findpkgs_tmp/fnd_ok_apps2
- mv -f /tmp/findpkgs_tmp/fnd_ok_apps2 /tmp/findpkgs_tmp/fnd_ok_apps
- echo "$ONESPEC" >> /tmp/findpkgs_tmp/fnd_ok_apps
- fi
- fi
- done
- done
- done
- echo -n "" > /tmp/findpkgs_tmp/PREFERRED_PKGS
- cat /tmp/findpkgs_tmp/fnd_ok_deps >> /tmp/findpkgs_tmp/PREFERRED_PKGS
- cat /tmp/findpkgs_tmp/fnd_ok_apps >> /tmp/findpkgs_tmp/PREFERRED_PKGS
- sort --key=3,3 --field-separator="|" -u /tmp/findpkgs_tmp/PREFERRED_PKGS > /tmp/findpkgs_tmp/PREFERRED_PKGS2
- grep -v '^linux_kernel|' /tmp/findpkgs_tmp/PREFERRED_PKGS2 > /tmp/findpkgs_tmp/PREFERRED_PKGS #remove dummy entry.
- cp -f /tmp/findpkgs_tmp/PREFERRED_PKGS ${STATUSDIR}/findpkgs_PREFERRED_PKGS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION} #so retained between boots.
- sync
- ###################
- ###SECOND SEARCH###
- ###################
- #now find all pkgs again, this time use prefs recorded in /tmp/findpkgs_tmp/PREFERRED_PKGS
- echo
- echo
- echo "Second pass at finding packages to be used in the Puppy build..."
- search_func 2 #result will be in /tmp/findpkgs_tmp/FINAL_PKGS
- #...each line is full db entry for package, prefixed with :generic-name:, pet/compat and repo-db-file
- # ex: :a52dec:|compat|Packages-puppy-wary5-official|a52dec-0.7.4-w5|a52dec|0.7.4-w5||BuildingBlock|68K||a52dec-0.7.4-w5.pet||A free ATSC A52 stream decoder|puppy|wary5||
- # 'compat' means pkg obtained from compatible-distro, in case of Wary they are also PETs.
- # :generic-name: usually coincides with actual name in package. multiple pkgs may be combined into one generic-name.
- # if the same pkg is combined into two different generic-names, then the line will look like this: :gcc_lib::gcc_dev:| (ex from Slacko).
- #110908 not-found pkgs are left in here without the genericname etc fields preprended...
- grep '^:' /tmp/findpkgs_tmp/FINAL_PKGS > /tmp/findpkgs_tmp/FINAL_PKGSx
- mv -f /tmp/findpkgs_tmp/FINAL_PKGSx /tmp/findpkgs_tmp/FINAL_PKGS
- sync
- sort --key=4,4 --field-separator="|" /tmp/findpkgs_tmp/FINAL_PKGS > ${STATUSDIR}/findpkgs_FINAL_PKGS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION} #so retained between boots.
- sync
- echo
- echo
- echo "Script finished. Result is in file"
- echo " status/findpkgs_FINAL_PKGS-${DISTRO_BINARY_COMPAT}-${DISTRO_COMPAT_VERSION}
- Each line is full db entry for pkg, prefixed with :generic-name:, pet/compat
- and db-file. ex:
- :a52dec:|compat|Packages-puppy-wary5-official|a52dec-0.7.4-w5|a52dec|0.7.4-w5||BuildingBlock|68K||a52dec-0.7.4-w5.pet||A free ATSC A52 stream decoder|puppy|wary5||
- 'compat' means pkg from compat-distro, in case of Wary they are also PETs
- :generic-name: is 2nd field in PKGS_SPECS_TABLE, note in some cases multiple
- packages are combined into same genericname, or same pkg can be shared by
- multiple genericnames -- latter case, line will look like: :gcc_lib::gcc_dev:|"
- ###END###
|