# This file is part of the src2pkg program: # Copyright 2005-2008 Gilbert Ashley # src2pkg is released under the GNU General Public License Version 2 ### unpack_source unpack_source() { if [[ ! $SOURCE_NAME ]] || [[ $SRC_DIR = $CWD ]] ; then true elif [[ "$FAILED" = "" ]] ; then echo -n $BLUE"Unpacking source archive - "$NORMAL cd $SRC_BUILDS_DIR/$SRC_DIR_NAME ; if [[ "$EXT" = "deb" ]] || [[ "$EXT" = "rpm" ]] || [[ "$EXT" = "src.rpm" ]] ; then # The disrpm program script uses 'hexdump' or 'od' to unpack either debian or rpm archives # works even better than rpm2cpio on older rpm archives if [[ $QUIET = "YES" ]] ; then disrpm -x $SOURCE &> /dev/null else echo "" disrpm -x $SOURCE fi elif [[ $QUIET = "YES" ]] ; then case $SOURCE in *.tar.bz2|*.tbz) tar xjf $SOURCE 1> /dev/null ;; *.tar.gz|*.tgz) tar xzf $SOURCE 1> /dev/null ;; esac else echo "" case $SOURCE in *.tar.bz2|*.tbz) tar xjvf $SOURCE ;; *.tar.gz|*.tgz) tar xzvf $SOURCE ;; esac fi if [[ $? -ne 0 ]] ; then echo $RED"FAILED!"$NORMAL echo "This may be caused by a defective or non-tar archive. "$RED"Exiting..."$NORMAL FAILED="UNPACK" else [[ $QUIET = "YES" ]] && echo $GREEN"Done"$NORMAL || echo "" UNPACK_NAME=$(ls $SRC_BUILDS_DIR/$SRC_DIR_NAME) examine_source fi fi } # local function called by unpack_source. Like the name-guessing code this is # clumsy-looking code using good heuristics to sort out what the content of the archive is # rpm archives get their internal tarred compressed archives unpacked here even with mismatched names examine_source() { cd $SRC_BUILDS_DIR ; if [[ $(ls $SRC_DIR_NAME/*) != "" ]] ; then cd $SRC_DIR_NAME ; CONTENT=$(ls) for item in $CONTENT ; do case $item in usr|etc|var|lib|bin|opt|sbin|boot|dev|tmp) [[ -d $item ]] && BIN_CONTENT=1 ;; control) [[ -f control ]] && SRC_TYPE="DEB" ;; install) [[ -d install ]] && SRC_TYPE="SLK" ; BIN_CONTENT=1 ;; *.spec) SRC_TYPE="RPM" ;; *.tar.bz2|*.tar.gz|*.tgz|*.tbz|*.tar) [[ -f $item ]] && FOUND_SOURCE=1 ;; esac done if [[ $BIN_CONTENT -eq 1 ]] ; then CONFIG_COMMAND="skip" ; INSTALL_COMMAND="skip" MAKE_COMMAND="copyall" else if [[ $(ls |wc -l) -eq 1 ]] ; then UNPACK_NAME=$(ls) if [[ -d $UNPACK_NAME ]] ; then [[ $DEBUG ]] && echo $BLUE"Found sources: "$NORMAL"$UNPACK_NAME"$NORMAL [[ $DEBUG ]] && echo $BLUE"Moving into SRC_DIR: "$NORMAL"$SRC_DIR_NAME" if [[ -e $UNPACK_NAME/$UNPACK_NAME ]] ; then mv $UNPACK_NAME/$UNPACK_NAME $UNPACK_NAME/$UNPACK_NAME.gotcha fi ( cd $UNPACK_NAME && mv ./* ../ ) cd $SRC_BUILDS_DIR/$SRC_DIR_NAME ; rm -rf $UNPACK_NAME # I found this gotcha when packaging the 'rar' program which unpacks to rar/rar if [[ -e $UNPACK_NAME.gotcha ]] ; then mv $UNPACK_NAME.gotcha $UNPACK_NAME fi OPEN_SOURCE=1 fi fi if ! [[ $OPEN_SOURCE ]] ; then for item in $(ls) ; do case $item in *.tar.bz2|*.tar.gz|*.tgz|*.tbz|*.tar) case $item in *.tar.bz2) INT_EXT='tar.bz2' ;; *.tbz) INT_EXT='tbz' ;; *.tar.gz) INT_EXT='tar.gz' ;; *.tgz) INT_EXT='tgz' ;; *.tar) INT_EXT='tar' ;; esac if [[ $(echo $item |grep "patch") ]] || [[ $(echo $item |grep "diff") ]]; then echo -n $BLUE"Ignoring compressed patch: "$NORMAL"$item " else #UNPACK_NAME=$(tar -tf $item |head --n 1 |cut -f1 -d'/') ITEM_NAME=$(basename $item .tar.bz2) ; ITEM_NAME=$(basename $item .tbz) ITEM_NAME=$(basename $item .tar.gz) ; ITEM_NAME=$(basename $item .tgz) ITEM_NAME=$(basename $item .tar) GUESSED_NAME=$(basename $RAW_SOURCE_NAME |rev |cut -f2- -d'-' |rev) case $item in $NAME-$VERSION.*|$GUESSED_NAME.*|$ORIG_NAME-$ORIG_VERSION.*|$NAME-cvs*) echo -n $BLUE"Decompressing matching archive: "$NORMAL"$item " case $item in *.tar.gz|.tgz) UNPACK_NAME=$(tar -tzf $item |head -n 1 |cut -f1 -d'/') tar xzf $item &> /dev/null ;; *.tar.bz2|*.tbz) UNPACK_NAME=$(tar -tjf $item |head -n 1 |cut -f1 -d'/') tar xjf $item &> /dev/null ;; *.tar) UNPACK_NAME=$(tar -tf $item |head -n 1 |cut -f1 -d'/') tar xf $item &> /dev/null ;; esac if [[ $? = 0 ]] && [[ -d $UNPACK_NAME ]] ; then echo $GREEN"Done!"$NORMAL if [[ -e $UNPACK_NAME/$UNPACK_NAME ]] ; then mv $UNPACK_NAME/$UNPACK_NAME $UNPACK_NAME/$UNPACK_NAME.gotcha fi ( cd $UNPACK_NAME && mv ./* ../ && cd .. ) rm -rf $UNPACK_NAME if [[ -e $UNPACK_NAME.gotcha ]] ; then mv $UNPACK_NAME.gotcha $UNPACK_NAME fi rm -f $item UNPACK_SUCCESS=1 else echo $RED"FAILED!"$NORMAL echo "Unable to unpack archive: $item "$RED"Exiting..."$NORMAL FAILED="UNPACK_RENAME" fi ;; *) if ! [[ $UNPACK_SUCCESS ]] ; then echo -n $BLUE"Decompressing (unknown) archive: "$NORMAL"$item " case $item in *.tar.gz|.tgz) UNPACK_NAME=$(tar -tzf $item |head -n 1 |cut -f1 -d'/') tar xzf $item &> /dev/null ;; *.tar.bz2|*.tbz) UNPACK_NAME=$(tar -tjf $item |head -n 1 |cut -f1 -d'/') tar xjf $item &> /dev/null ;; *.tar) UNPACK_NAME=$(tar -tf $item |head -n 1 |cut -f1 -d'/') tar xf $item &> /dev/null ;; esac if [[ $? = 0 ]] && [[ -d $UNPACK_NAME ]] ; then echo $GREEN"Done!"$NORMAL if [[ -e $UNPACK_NAME/$UNPACK_NAME ]] ; then mv $UNPACK_NAME/$UNPACK_NAME $UNPACK_NAME/$UNPACK_NAME.gotcha fi echo $CYAN"Notice - "$NORMAL"Internal archive name mismatch: $UNPACK_NAME" ( cd $UNPACK_NAME && mv ./* ../ && cd .. ) rm -rf $UNPACK_NAME if [[ -e $UNPACK_NAME.gotcha ]] ; then mv $UNPACK_NAME.gotcha $UNPACK_NAME fi rm -f $item UNPACK_SUCCESS=1 else echo $RED"FAILED!"$NORMAL echo "Unable to unpack $item. "$RED"Exiting..."$NORMAL FAILED="UNPACK_RENAME" fi else echo $BLUE"Ignoring archive: "$NORMAL"$item" fi ;; esac fi ;; esac done fi fi else echo $RED"FAILED!"$NORMAL echo "Source directory is empty. "$RED"Exiting..."$NORMAL FAILED="EMPTY_SOURCE" fi }