Advertising
- Anonymous
- Saturday, May 5th, 2012 at 4:05:14pm MDT
- #!/bin/bash
- function aur_check {
- STARTDIR=`pwd`
- cd /var/cache/pacman
- for r in `pacman -Qmq`; do
- wget "http://aur.archlinux.org/packages/$r/$r/PKGBUILD" >/dev/null 2>&1
- if [ $? -eq 0 ]; then
- LOCAL_VERSION_REL=`'pacman' -Q $r | awk '{print $2}'`
- LOCAL_VERSION=`echo $LOCAL_VERSION_REL| sed -e 's/-.*//g'`
- REMOTE_VERSION=`cat PKGBUILD | grep -E '^pkgver=' | sed -e 's/pkgver=//g' | sed -e 's/[ ]*//g'`
- REMOTE_REL=`cat PKGBUILD | grep -E '^pkgrel=' | sed -e 's/pkgrel=//g'`
- if [[ "$LOCAL_VERSION" < "$REMOTE_VERSION" ]]; then
- printf "warning: $r: ignoring package upgrade ($LOCAL_VERSION_REL => ${REMOTE_VERSION}-${REMOTE_REL})\n"
- fi
- rm PKGBUILD
- fi
- done
- cd "$STARTDIR"
- }
- function sync_check {
- STARTDIR=`pwd`
- cd /var/cache/pacman
- IGNORED_PACKAGES=`cat /etc/pacman.conf | grep -E '^IgnorePkg' | sed -e 's/IgnorePkg[ ]*=[ ]*//g'`
- for s in $IGNORED_PACKAGES; do
- REMOTE_VERSION_STRING=`'pacman' -Si $s 2>/dev/null | grep -E '^Version'`
- if [ $? -eq 0 ]; then
- REMOTE_VERSION_REL=`echo $REMOTE_VERSION_STRING | awk '{print $3}'`
- LOCAL_VERSION_STRING=`'pacman' -Q $s 2>/dev/null`
- if [ $? -eq 0 ]; then
- LOCAL_VERSION_REL=`echo $LOCAL_VERSION_STRING | awk '{print $2}'`
- printf "warning: $s: ignoring package upgrade ($LOCAL_VERSION_REL => $REMOTE_VERSION_REL)\n"
- fi
- fi
- done
- cd "$STARTDIR"
- }
- function remove_crap {
- # No docs or schemas.
- if [ ! -e ./usr/share/gtk-doc/data/gtk-doc.make ]; then
- rm -rf 2>/dev/null ./usr/share/gtk-doc
- fi
- rm -rf 2>/dev/null ./usr/share/doc
- rm -rf 2>/dev/null ./usr/share/gnome
- rm -rf 2>/dev/null ./usr/share/gnome-control-center
- rm -rf 2>/dev/null ./etc/gconf
- # No MIME-type forcage!
- find . -name *.desktop -exec sed -i -e '/MimeType=/d' {} \;
- # Please delete this file. It is not necessary for linking the library.
- if [ ! -e ./usr/bin/convert ]; then
- find . -name "*.la" -exec rm {} \;
- fi
- # Only one man directory please.
- if [ -d ./usr/man ]; then
- if [ ! -d ./usr/share ]; then
- mkdir ./usr/share
- fi
- mv ./usr/man ./usr/share/man
- fi
- if [ -d ./usr/share/man ]; then
- cd ./usr/share/man
- ls | grep 'cat' | xargs rm -rf
- if [ -d ./man ]; then
- mv ./man/* .
- rm -rf ./man
- fi
- # Imposes what I consider to be a better naming convention for some reason.
- for t in `ls`; do
- if [ $t != 'man0' ] && [ $t != 'man1' ] && [ $t != 'man2' ] && [ $t != 'man3' ] && [ $t != 'man4' ] && [ $t != 'man5' ] && [ $t != 'man6' ] && [ $t != 'man7' ] && [ $t != 'man8' ] && [ $t != 'man9' ] && [ $t != 'mann' ] && [ $t != 'manm' ]; then
- cd $t
- for u in `ls`; do
- cd $u
- for v in `ls`; do
- SECOND_LAST_EXTENSION=`echo $v | sed -e 's/\.gz$//g' | rev | sed -e 's/\..*//g' | rev`
- PREFIX=`echo $v | sed -e 's/\.gz$//g' | sed -e "s/\.${SECOND_LAST_EXTENSION}//g"`
- SUFFIX=`echo $v | sed -e "s/$PREFIX//g"`
- if [ ! -h $v ]; then
- install -D $v ../../${u}/${PREFIX}-${t}${SUFFIX}
- else
- TARGET=`readlink $v`
- TARGET_SECOND_LAST_EXTENSION=`echo $TARGET | sed -e 's/\.gz$//g' | rev | sed -e 's/\..*//g' | rev`
- TARGET_PREFIX=`echo $TARGET | sed -e 's/\.gz$//g' | sed -e "s/\.${TARGET_SECOND_LAST_EXTENSION}//g"`
- TARGET_SUFFIX=`echo $TARGET | sed -e "s/${TARGET_PREFIX}//g"`
- install -d ../../${u}
- ln -sf ${TARGET_PREFIX}-${t}${TARGET_SUFFIX} ../../${u}/${PREFIX}-${t}${SUFFIX}
- fi
- done
- cd ..
- done
- cd ..
- rm -rf $t
- fi
- done
- # Now that it is nicely organized we can gzip everything and add symlinks.
- for x in `ls`; do
- cd $x
- for y in `ls`; do
- echo $y | grep -q -E '\.gz$'
- if [ $? -ne 0 ]; then
- gzip $y >/dev/null 2>&1
- SECOND_LAST_EXTENSION=`echo $y | rev | sed -e 's/\..*//g' | rev`
- PREFIX=`echo $y | sed -e "s/\.${SECOND_LAST_EXTENSION}//g"`
- NEW_NAME=`echo $PREFIX | sed -e 's/\./-/g'`
- if [ $NEW_NAME != $PREFIX ]; then
- ln -sf ${y}.gz ${NEW_NAME}.${SECOND_LAST_EXTENSION}.gz
- fi
- else
- SECOND_LAST_EXTENSION=`echo $y | sed -e 's/\.gz$//g' | rev | sed -e 's/\..*//g' | rev`
- PREFIX=`echo $y | sed -e 's/\.gz//g' | sed -e "s/\.${SECOND_LAST_EXTENSION}//g"`
- NEW_NAME=`echo $PREFIX | sed -e 's/\./-/g'`
- if [ $NEW_NAME != $PREFIX ]; then
- ln -sf ${y} ${NEW_NAME}.${SECOND_LAST_EXTENSION}.gz
- fi
- fi
- done
- cd ..
- done
- cd ../../..
- fi
- # Converts info pages to man pages in the man9 directory
- if [ -d ./usr/share/info ]; then
- if [ -d ./usr/share/man ]; then
- mkdir ./usr/share/man/man9
- else
- mkdir ./usr/share/man
- mkdir ./usr/share/man/man9
- fi
- cd ./usr/share/info
- for z in `ls`; do
- echo $z | grep -q -E '\.gz$'
- if [ $? -eq 0 ]; then
- NAME=`echo $z | sed -e 's/\.gz$//g'`
- NEWNAME=`echo $NAME | sed -e 's/\./-/g'`
- gunzip $z
- info2man $NAME > ../man/man9/${NEWNAME}
- gzip ../man/man9/${NEWNAME} >/dev/null 2>&1
- else
- NEWNAME=`echo $z | sed -e 's/\./-/g'`
- info2man $z > ../man/man9/${NEWNAME}
- gzip ../man/man9/${NEWNAME} >/dev/null 2>&1
- fi
- done
- cd ../../..
- rm -rf ./usr/share/info
- fi
- }
- function install_with_u {
- ULTIMATE_ANSWER="y"
- # Checks if there are package conflicts
- CONFLICTS=`cat .PKGINFO | grep 'conflict = ' | awk '{print $3}'`
- ACTUAL_CONFLICTS=""
- for p in $CONFLICTS; do
- VERSION_CHECK=0
- CONFLICTING_PACKAGE=`echo $p | sed -r 's/(>|=|<).*//g'`
- # Checks if these conflicts actually affect packages on the system
- 'pacman' -Q $CONFLICTING_PACKAGE >/dev/null 2>&1
- if [ $? -eq 0 ]; then
- AFFECTED=1
- if [ ${#p} -gt ${#CONFLICTING_PACKAGE} ]; then
- AFFECTED=0
- # If a version is specified, finds it out and sees if we're affected
- CONFLICTING_VERSION_STRING=${p:${#CONFLICTING_PACKAGE}:${#p}-${#CONFLICTING_PACKAGE}}
- RELATION=${CONFLICTING_VERSION_STRING:1:2}
- if [ "$RELATION" = "=" ]; then
- RELATION=${CONFLICTING_VERSION_STRING:0:1}${RELATION}
- CONFLICTING_VERSION=${CONFLICTING_VERSION_STRING:2:${#CONFLICTING_VERSION_STRING}-2}
- else
- RELATION=${CONFLICTING_VERSION_STRING:0:1}
- CONFLICTING_VERSION=${CONFLICTING_VERSION_STRING:1:${#CONFLICTING_VERSION_STRING}-1}
- fi
- # If the conflicting package is being downloaded as we speak, the non-conflicting version will soon be available
- ls /var/cache/pacman/tmp | grep -q "$CONFLICTING_PACKAGE"
- if [ $? -eq 0 ]; then
- AFFECTED=0
- else
- ACTUAL_VERSION=`pacman -Q $CONFLICTING_PACKAGE | awk '{print $2}'`
- if [ "$RELATION" = ">" ]; then
- if [[ "$ACTUAL_VERSION" > "$CONFLICTING_VERSION" ]]; then
- AFFECTED=1
- fi
- elif [ "$RELATION" = "<" ]; then
- if [[ "$ACTUAL_VERSION" < "$CONFLICTING_VERSION" ]]; then
- AFFECTED=1
- fi
- elif [ "$RELATION" = ">=" ]; then
- if [ "$ACTUAL_VERSION" >= "$CONFLICTING_VERSION" ]; then
- AFFECTED=1
- fi
- elif [ "$RELATION" = "<=" ]; then
- if [ "$ACTUAL_VERSION" <= "$CONFLICTING_VERSION" ]; then
- AFFECTED=1
- fi
- else
- if [ "$ACTUAL_VERSION" = "$CONFLICTING_VERSION" ]; then
- AFFECTED=1
- fi
- fi
- fi
- fi
- if [ $AFFECTED -ne 0 ]; then
- ACTUAL_CONFLICTS="$ACTUAL_CONFLICTS $CONFLICTING_PACKAGE"
- printf ":: ${1} conflicts with ${CONFLICTING_PACKAGE}. Remove ${CONFLICTING_PACKAGE}? [Y/n] "
- read ANSWER
- if [ $ANSWER != "Y" ] && [ $ANSWER != "y" ]; then
- ULTIMATE_ANSWER="n"
- break
- fi
- fi
- fi
- done
- if [ $ULTIMATE_ANSWER = "y" ]; then
- for q in $ACTUAL_CONFLICTS; do
- 'pacman' -Rdd ${q}
- done
- return 0
- fi
- return 1
- }
- function get_deps {
- PACKAGE_NAME=`cat .PKGINFO | grep 'pkgname = ' | sed -e 's/pkgname = //g'`
- # Does a few package specific things
- if [ "$PACKAGE_NAME" = "linux" ]; then
- echo ""
- #elif [ "$PACKAGE_NAME" = "firefox" ]; then
- # cd ./usr/lib
- # FIREFOX_DIR=`ls | grep 'firefox'`
- # if [ $? -eq 0 ]; then
- # cd $FIREFOX_DIR/chrome
- # jar -xf ./browser.jar
- # rm ./browser.jar
- # sed -i -e '/console.xul/s/^/\/\//g' ./content/browser/browser.js
- # jar -cf browser.jar content
- # rm -r content
- # cd ../..
- # fi
- # cd ../..
- elif [ "$PACKAGE_NAME" = "gstreamer0.10-good-plugins" ]; then
- rm ./usr/lib/gstreamer-0.10/libgstesd.so
- rm ./usr/lib/gstreamer-0.10/libgstsouphttpsrc.so
- rm ./usr/lib/gstreamer-0.10/libgstgconfelements.so
- rm ./usr/lib/gstreamer-0.10/libgsthalelements.so
- sed -i -e '/^depend\ =\ esound/d' .PKGINFO
- sed -i -e '/^depend\ =\ libsoup-gnome/d' .PKGINFO
- sed -i -e '/^depend\ =\ gconf/d' .PKGINFO
- sed -i -e '/^depend\ =\ hal/d' .PKGINFO
- elif [ "$PACKAGE_NAME" = "libao" ]; then
- rm ./usr/lib/ao/plugins-4/libesd.so
- elif [ "$PACKAGE_NAME" = "meld" ]; then
- rm ./usr/lib/meld/meld/ui/notebooklabel.pyc
- sed -i -e '/self\.set_size_request/s/^/#/' ./usr/lib/meld/meld/ui/notebooklabel.py
- sed -i -e '/label\.set_ellipsize/s/^/#/' ./usr/lib/meld/meld/ui/notebooklabel.py
- elif [ "$PACKAGE_NAME" = "flac" ]; then
- rm -r ./usr/lib/xmms
- elif [ "$PACKAGE_NAME" = "initscripts" ]; then
- mv ./etc/rc.d/network ./etc/rc.d/network.orig
- elif [ "$PACKAGE_NAME" = "python2-matplotlib" ]; then
- rm -r ./usr/lib/python2.7/site-packages/matplotlib/tests
- elif [ "$PACKAGE_NAME" = "kino" ]; then
- mv ./usr/share/kino/scripts/import/media.sh ./usr/share/kino/scripts/import/media.sh.orig
- fi
- POSSIBLE_LIBS=`find . -type f | grep -E '(\.so\.|\.so$)'`
- POSSIBLE_BINS=`find . -type f | grep -v 'PKGINFO' | grep -v -E '\/.*\.[a-zA-Z0-9]+$' | grep -v 'LICENSE'`
- POSSIBLE_ELFS="$POSSIBLE_LIBS $POSSIBLE_BINS"
- DEPS=""
- # Makes a list of all the direct dependencies
- for i in $POSSIBLE_ELFS; do
- #echo "SCANNING: $i"
- #ldd $i >/dev/null 2>&1
- readelf -d $i >/dev/null 2>&1
- if [ $? -eq 0 ]; then
- # Caches the shared libraries in a file to make it easier for everything else to look them up
- DIRNAME=`dirname ${i:1:${#i}}`
- echo "$i" | grep -q ".so"
- if [ $? -eq 0 ]; then
- if [ "$DIRNAME" = "/lib" ] || [ "$DIRNAME" = "/usr/lib" ]; then
- grep -q "${i:1:${#i}} $PACKAGE_NAME" /var/cache/pacman/quicklookup
- # If this package's library assigned to this package was not found...
- if [ $? -ne 0 ]; then
- grep -q "${i:1:${#i}}" /var/cache/pacman/quicklookup
- # It may have been assigned to another package so we change that
- if [ $? -eq 0 ]; then
- sed -i -e "/${i:1:${#i}}/d" /var/cache/pacman/quicklookup
- fi
- # Otherwise we just assign it to this package
- echo "${i:1:${#i}} $PACKAGE_NAME" >> /var/cache/pacman/quicklookup
- fi
- fi
- fi
- # Figures out what packages own the library dependencies
- #POSSIBLE_DEPS=`ldd $i 2>/dev/null | grep '=> ' | grep -v '=> ' | sed -e 's/.* => //g' | sed -e 's/ (.*//g'`
- POSSIBLE_DEPS=`readelf -d $i 2>/dev/null | grep 'NEEDED' | sed -e 's/.*library:\ \[//g' | sed -e 's/\]//g'`
- for j in $POSSIBLE_DEPS; do
- #DIRNAME=`dirname $j`
- #if [ "$DIRNAME" = "/lib" ] || [ "$DIRNAME" = "/usr/lib" ]; then
- OWNER=`grep "$j" /var/cache/pacman/quicklookup`
- # The owner of the dep is either already in the quicklookup file
- if [ $? -eq 0 ]; then
- OWNER=`echo $OWNER | awk '{print $2}'`
- DEPS="$DEPS $OWNER"
- else
- # Or it's part of the current package
- #BASENAME=`basename $j`
- #find . -name ${BASENAME} | grep -q "${BASENAME}"
- find . -name $j | grep -q $j
- if [ $? -eq 0 ]; then
- echo "/usr/lib/$j $PACKAGE_NAME" >> /var/cache/pacman/quicklookup
- else
- # Or we figure out its owner with pacman and put it in the quicklookup file
- OWNER=`'pacman' -Qoq "/usr/lib/$j" 2>/dev/null`
- if [ $? -eq 0 ]; then
- echo "$j $OWNER" >> /var/cache/pacman/quicklookup
- DEPS="$DEPS $OWNER"
- fi
- fi
- fi
- #fi
- done
- fi
- done
- # Sticks a "kernel26" between the old dependencies and the new dependencies
- CURRENT_DEPS=`cat .PKGINFO | grep -E '^depend = ' | sed -e 's/depend = //g'`
- DEPS="$CURRENT_DEPS kernel26a $DEPS"
- # Puts them into the PKGINFO file so that all depend lines are contiguous
- grep -q -E '^depend = ' .PKGINFO
- if [ $? -eq 0 ]; then
- FIRST_DEPEND_LINE_NUMBER=`grep -n -E '^depend = ' .PKGINFO | head -1 | sed -e 's/:.*//g'`
- LAST_DEPEND_LINE_NUMBER=`grep -n -E '^depend = ' .PKGINFO | tail -1 | sed -e 's/:.*//g'`
- LAST_LINE_NUMBER=`wc -l .PKGINFO | awk '{print $1}'`
- (( DIFFERENCE=$LAST_LINE_NUMBER-$LAST_DEPEND_LINE_NUMBER ))
- cat .PKGINFO | tail -${DIFFERENCE} > .PKGINFO-3
- touch .PKGINFO-2
- (( FIRST_DEPEND_LINE_NUMBER-- ))
- cat .PKGINFO | head -${FIRST_DEPEND_LINE_NUMBER} > .PKGINFO-1
- else
- cp .PKGINFO .PKGINFO-1
- touch .PKGINFO-2
- touch .PKGINFO-3
- fi
- for k in $DEPS; do
- echo "depend = $k" >> .PKGINFO-2
- done
- # This is all so we don't get mesa and mesa=7.5 in the same dep array
- cat .PKGINFO-2 | awk '{print $3}' | sed -r 's/(>=|>|=|<|<=)/ \1/g' > .RAW-DEPS
- cat .RAW-DEPS | awk '{print $1}' > .COL-1
- cat .RAW-DEPS | awk '{print $2}' > .COL-2
- # Got this from sed1line.txt... it removes duplicate lines
- sed -i -n 'G; s/\n/&&/; /^\([ -~]*\n\).*\n\1/d; s/\n//; h; P' .COL-1
- paste --delimiter="" .COL-1 .COL-2 > .RAW-DEPS
- sed -i -e "/${PACKAGE_NAME}/d" .RAW-DEPS
- sed -i -e 's/kernel26a/kernel26/g' .RAW-DEPS
- sed -e 's/^/depend = /g' .RAW-DEPS > .PKGINFO-2
- sed -i -e "/depend =[ ]*$/d" .PKGINFO-2
- cat .PKGINFO-1 .PKGINFO-2 .PKGINFO-3 > .PKGINFO
- rm .PKGINFO-1 .PKGINFO-2 .PKGINFO-3 .RAW-DEPS .COL-1 .COL-2
- }
- function do_install {
- STARTDIR=`pwd`
- cd /var/cache/pacman/tmp
- # We don't want to screw with pacman or glibc
- HOLD_PACKAGES=`cat /etc/pacman.conf | grep -E '^HoldPkg' | sed -e 's/HoldPkg[ ]*=[ ]*//g'`
- for s in $HOLD_PACKAGES; do
- SUSPECTS=`ls | grep "$s-"`
- if [ $? -eq 0 ]; then
- for l in $SUSPECTS; do
- TEMP_NAME=`echo $l | sed -r 's/(-i686|-x86_64|-any|)\.pkg\.tar\.(g|x)z//g'`
- HYPHEN_SUFFIX=`echo $TEMP_NAME | sed -e "s/$s-//" | sed -e 's/-//'`
- echo $HYPHEN_SUFFIX | grep -q '-'
- if [ $? -ne 0 ]; then
- printf ":: $s is designated as a HoldPkg."
- exit 1
- fi
- done
- fi
- done
- for l in `ls -tr`; do
- REASON=0
- TEMP_DIR=`echo "$l" | sed -r 's/(-i686|-x86_64|-any|)\.pkg\.tar\.(g|x)z//g'`
- # Makes sure it doesn't install two versions of the same package
- TO_BE_REMOVED_1=`echo "$TEMP_DIR" | rev | sed -e 's/-.*//'`
- INTERMEDIATE_PACKAGE_NAME=`echo "$TEMP_DIR" | rev | sed -e "s/${TO_BE_REMOVED_1}-//"`
- TO_BE_REMOVED_2=`echo "$INTERMEDIATE_PACKAGE_NAME" | sed -e 's/-.*//'`
- PACKAGE_NAME=`echo "$INTERMEDIATE_PACKAGE_NAME" | sed -e "s/${TO_BE_REMOVED_2}-//" | rev`
- for m in `ls -tr | grep -v "$l"`; do
- NEW_TEMP_DIR=`echo "$m" | sed -r 's/(-i686|-x86_64|-any|)\.pkg\.tar\.(g|x)z//g'`
- NEW_TO_BE_REMOVED_1=`echo "$NEW_TEMP_DIR" | rev | sed -e 's/-.*//'`
- NEW_INTERMEDIATE_PACKAGE_NAME=`echo "$NEW_TEMP_DIR" | rev | sed -e "s/${NEW_TO_BE_REMOVED_1}-//"`
- NEW_TO_BE_REMOVED_2=`echo $"NEW_INTERMEDIATE_PACKAGE_NAME" | sed -e 's/-.*//'`
- NEW_PACKAGE_NAME=`echo "$NEW_INTERMEDIATE_PACKAGE_NAME" | sed -e "s/${NEW_TO_BE_REMOVED_2}-//" | rev`
- if [ "$PACKAGE_NAME" = "$NEW_PACKAGE_NAME" ]; then
- mv "$l" ../pkg
- break;
- fi
- done
- # Extracts the package and makes the necessary modifications to it
- mkdir "$TEMP_DIR"
- mv "$l" "$TEMP_DIR"
- cd "$TEMP_DIR"
- tar -xf "./$l" >/dev/null 2>&1
- rm "$l"
- remove_crap
- get_deps
- # Retars the package and installs it
- if [ -e .INSTALL ]; then
- tar -cf "./$l" .INSTALL .PKGINFO * >/dev/null 2>&1
- else
- tar -cf "./$l" .PKGINFO * >/dev/null 2>&1
- fi
- # Installs it and puts it in the cache
- install_with_u $l
- if [ $? -eq 0 ]; then
- if [ $# -eq 0 ]; then
- # If there are no arguments, we are doing a mass upgrade and we keep the same install reasons packages had before
- 'pacman' -Q ${PACKAGE_NAME} >/dev/null 2>&1
- if [ $? -eq 0 ]; then
- 'pacman' -Qi ${PACKAGE_NAME} | grep -q 'Installed as a dependency for another package'
- if [ $? -eq 0 ]; then
- REASON=1
- fi
- fi
- else
- # If there are arguments we must search them for the given package to see if it is explicit
- ARGLIST=" $@ "
- echo $ARGLIST | grep -q "${PACKAGE_NAME}"
- if [ $? -ne 0 ]; then
- REASON=1
- fi
- fi
- if [ $REASON -eq 1 ]; then
- 'pacman' -Uddf --noconfirm --asdeps $l
- else
- 'pacman' -Uddf --noconfirm $l
- fi
- else
- mv $l ../../pkg
- cd ..
- rm -r $TEMP_DIR
- break;
- fi
- mv $l ../../pkg
- cd ..
- rm -r $TEMP_DIR
- done
- cd "$STARTDIR"
- }
- function get_answer {
- read ANSWER
- echo $ANSWER > /var/cache/pacman/answer
- echo $ANSWER
- }
- if [ "$1" = "-Syu" ]; then
- #sync_check
- #aur_check
- 'pacman' --cachedir /var/cache/pacman/tmp -Syuw
- do_install
- elif [ "$1" = "-Su" ]; then
- #sync_check
- #aur_check
- 'pacman' --cachedir /var/cache/pacman/tmp -Suw
- do_install
- elif [ "$1" = "-S" ]; then
- # If the temporary cache and its contents still exist, they will be installed when we don't want them to be
- rm -r /var/cache/pacman/tmp
- mkdir /var/cache/pacman/tmp
- shift
- PACKAGE_ARRAY=""
- # If something we're installing is in the cache... move it to the temporary cache
- for n in $@; do
- if [ ${n:0:1} != "-" ]; then
- NUM_MATCHES=`ls -1 /var/cache/pacman/pkg | grep -E "^${n}-" | wc -l`
- for o in `seq 1 $NUM_MATCHES`; do
- MOVE_MATCH=0
- POSSIBLE_MATCH=`ls -r /var/cache/pacman/pkg | grep -E "^${n}-" -m${o} | tail -1`
- HYPHENS=`echo $POSSIBLE_MATCH | sed -e "s/${n}//g" | grep -o "-" | wc -l`
- if [ $HYPHENS -le 3 ]; then
- VERSION=`'pacman' -Si ${n} | grep 'Version' | awk '{print $3}'`
- echo $POSSIBLE_MATCH | grep -q "$VERSION"
- if [ $? -eq 0 ]; then
- mv /var/cache/pacman/pkg/${POSSIBLE_MATCH} /var/cache/pacman/tmp
- # Changes the stored md5sum temporarily - I don't know a better way to do this
- TEMP_DIR=`echo ${POSSIBLE_MATCH} | sed -r 's/(-i686|-x86_64|-any|)\.pkg\.tar\.(g|x)z//g'`
- find /var/lib/pacman/sync -name $TEMP_DIR | grep -q $TEMP_DIR
- if [ $? -eq 0 ]; then
- MD5SUM=`md5sum /var/cache/pacman/tmp/${POSSIBLE_MATCH} | awk '{print $1}'`
- REPOS=`find /var/lib/pacman/sync -name $TEMP_DIR | sed -e 's/\// /g' | awk '{print $5}'`
- sed -i '/%MD5SUM%/G' /var/lib/pacman/sync/$REPOS/$TEMP_DIR/desc
- MD5_LINE_NUMBER=`grep -n '%MD5SUM%' /var/lib/pacman/sync/$REPOS/$TEMP_DIR/desc | sed -e 's/:.*//g'`
- (( MD5_LINE_NUMBER++ ))
- sed -i -e "${MD5_LINE_NUMBER}s/.*/${MD5SUM}/" /var/lib/pacman/sync/$REPOS/$TEMP_DIR/desc
- PACKAGE_ARRAY="${PACKAGE_ARRAY} ${REPOS}/${TEMP_DIR}"
- fi
- break;
- fi
- fi
- done
- fi
- done
- # Pacman is run and then a function reads a y or an n from stdin and passes it to pacman's stdin
- get_answer | 'pacman' --cachedir /var/cache/pacman/tmp -Sw $@
- # The function also saves it in a file so we know whether to proceed or cancel because pacman was cancelled
- LETTER=`cat /var/cache/pacman/answer`
- if [ "$LETTER" = "y" ] || [ "$LETTER" = "Y" ]; then
- do_install $@
- else
- # If anything got moved to the temporary cache for this it is sent back to the main one
- FILES_IN_CACHE=`ls /var/cache/pacman/tmp | wc -l`
- if [ $FILES_IN_CACHE -ne 0 ]; then
- mv /var/cache/pacman/tmp/* /var/cache/pacman/pkg
- fi
- fi
- # Changes all the md5sums back
- for w in $PACKAGE_ARRAY; do
- MD5_LINE_NUMBER=`grep -n '%MD5SUM%' /var/lib/pacman/sync/$w/desc | sed -e 's/:.*//g'`
- (( MD5_LINE_NUMBER++ ))
- sed -i -e "${MD5_LINE_NUMBER}d" /var/lib/pacman/sync/$w/desc
- done
- elif [ "$1" = "-U" ]; then
- STARTDIR=`pwd`
- TEMP_DIR=`echo $2 | sed -r 's/(-i686|-x86_64|-any|)\.pkg\.tar\.(g|x)z//g'`
- mkdir /var/cache/pacman/$TEMP_DIR
- cp "$2" /var/cache/pacman/$TEMP_DIR || return 1
- cd /var/cache/pacman/$TEMP_DIR
- tar -xf $2 >/dev/null 2>&1
- rm $2
- get_deps
- # Retars the package and installs it
- if [ -e .INSTALL ]; then
- tar -cf $2 .INSTALL .PKGINFO * >/dev/null 2>&1
- else
- tar -cf $2 .PKGINFO * >/dev/null 2>&1
- fi
- install_with_u $2
- if [ $? -eq 0 ]; then
- 'pacman' -U --noconfirm $2
- fi
- cd ..
- rm -r $TEMP_DIR
- cd "$STARTDIR"
- elif [ "$1" = "-Qi" ] || [ "$1" = "-Qii" ]; then
- INITIAL_ARG=$1
- shift
- if [ "$INITIAL_ARG" = "-Qi" ]; then
- 'pacman' -Qi $@ > /var/cache/pacman/tempquery
- else
- 'pacman' -Qii $@ > /var/cache/pacman/tempquery
- fi
- if [ $? -ne 0 ] || [ ! -e /var/cache/pacman/tempquery ]; then
- exit 1
- fi
- # Filters out all deps after kernel26 for a regular query
- # Filters out all deps before kernel26 for a verbose query
- if [ $? -eq 0 ]; then
- START_LINE_NUMBER=`cat /var/cache/pacman/tempquery | grep -n 'Depends On' | sed -e 's/:.*//g'`
- LINE_NUMBER=$START_LINE_NUMBER
- (( LINE_NUMBER=$LINE_NUMBER+1 ))
- cat /var/cache/pacman/tempquery | head -${LINE_NUMBER} | tail -1 | grep ':'>/dev/null 2>&1
- while [ $? -ne 0 ]; do
- (( LINE_NUMBER=$LINE_NUMBER+1 ))
- cat /var/cache/pacman/tempquery | head -${LINE_NUMBER} | tail -1 | grep ':'>/dev/null 2>&1
- done
- (( END_LINE_NUMBER=$LINE_NUMBER-1 ))
- (( DIFFERENCE=$LINE_NUMBER-$START_LINE_NUMBER ))
- OLD_DEP_LIST=`cat /var/cache/pacman/tempquery | head -${END_LINE_NUMBER} | tail -${DIFFERENCE} | sed -e 's/.* : //g' | sed -e 's/ //g'`
- for k in $OLD_DEP_LIST; do
- if [ "$INITIAL_ARG" = "-Qi" ]; then
- if [ "$k" != "kernel26" ]; then
- NEW_DEP_LIST="$NEW_DEP_LIST $k"
- else
- break
- fi
- else
- if [ "$k" != "kernel26" ]; then
- NEW_DEP_LIST="$NEW_DEP_LIST $k"
- fi
- fi
- done
- fi
- # Removes the old deps array and replaces it with the new one
- sed -i -e "${START_LINE_NUMBER},${END_LINE_NUMBER}d" /var/cache/pacman/tempquery
- (( START_LINE_NUMBER=$START_LINE_NUMBER-1 ))
- END_LINE_NUMBER=`wc -l /var/cache/pacman/tempquery | awk '{print $1}'`
- (( DIFFERENCE=$END_LINE_NUMBER-$START_LINE_NUMBER ))
- cat /var/cache/pacman/tempquery | head -${START_LINE_NUMBER} > /var/cache/pacman/tempquery-1
- cat /var/cache/pacman/tempquery | tail -${DIFFERENCE} > /var/cache/pacman/tempquery-3
- CURRENT_LINE=""
- CURRENT_LINE_NUMBER=1
- for m in $NEW_DEP_LIST; do
- if (( ${#CURRENT_LINE}+${#m}+1<=63 )); then
- CURRENT_LINE="$CURRENT_LINE $m"
- else
- if [ $CURRENT_LINE_NUMBER -eq 1 ]; then
- printf "Depends On :$CURRENT_LINE\n" >> /var/cache/pacman/tempquery-2
- else
- printf "\t\t$CURRENT_LINE\n" >> /var/cache/pacman/tempquery-2
- fi
- CURRENT_LINE=" $m"
- CURRENT_LINE_NUMBER=0
- fi
- done
- if [ $CURRENT_LINE_NUMBER -eq 1 ]; then
- printf "Depends On :$CURRENT_LINE\n" >> /var/cache/pacman/tempquery-2
- else
- printf "\t\t$CURRENT_LINE\n" >> /var/cache/pacman/tempquery-2
- fi
- cat /var/cache/pacman/tempquery-1 /var/cache/pacman/tempquery-2 /var/cache/pacman/tempquery-3 > /var/cache/pacman/tempquery
- # Removes the requirements array for a regular query
- if [ "$INITIAL_ARG" = "-Qi" ]; then
- START_LINE_NUMBER=`cat /var/cache/pacman/tempquery | grep -n 'Required By' | sed -e 's/:.*//g'`
- LINE_NUMBER=$START_LINE_NUMBER
- (( LINE_NUMBER=$LINE_NUMBER+1 ))
- cat /var/cache/pacman/tempquery | head -${LINE_NUMBER} | tail -1 | grep ':'>/dev/null 2>&1
- while [ $? -ne 0 ]; do
- (( LINE_NUMBER++ ))
- cat /var/cache/pacman/tempquery | head -${LINE_NUMBER} | tail -1 | grep ':'>/dev/null 2>&1
- done
- (( END_LINE_NUMBER=$LINE_NUMBER-1 ))
- sed -i -e "${START_LINE_NUMBER},${END_LINE_NUMBER}d" /var/cache/pacman/tempquery
- fi
- cat /var/cache/pacman/tempquery
- rm /var/cache/pacman/tempquery /var/cache/pacman/tempquery-1 /var/cache/pacman/tempquery-2 /var/cache/pacman/tempquery-3
- elif [ "$1" = "-Scc" ]; then
- LINE_NUMBER=0
- for z in `cat /var/cache/pacman/quicklookup | awk '{print $1}'`; do
- (( LINE_NUMBER++ ))
- if [ ! -e $z ]; then
- sed -i -e "${LINE_NUMBER}d" /var/cache/pacman/quicklookup
- (( LINE_NUMBER-- ))
- fi
- done
- 'pacman' -Scc
- else
- 'pacman' $@
- fi
advertising
Update the Post
Either update this post and resubmit it with changes, or make a new post.
You may also comment on this post.
Please note that information posted here will expire by default in one month. If you do not want it to expire, please set the expiry time above. If it is set to expire, web search engines will not be allowed to index it prior to it expiring. Items that are not marked to expire will be indexable by search engines. Be careful with your passwords. All illegal activities will be reported and any information will be handed over to the authorities, so be good.