| 1 | #!/bin/bash |
|---|
| 2 | # Helper bash script to build debian biarch i386 and amd64 packages from SVN |
|---|
| 3 | # Requires: svn-buildpackage, pbuilder, awk, reprepro, sed |
|---|
| 4 | # Coyright 2007 Alan Baghumian / GNU/GPL |
|---|
| 5 | # |
|---|
| 6 | # Created: 2007-10-20 15:10 +330 GMT |
|---|
| 7 | # Updated: 2007-10-21 14:39 +330 GMT |
|---|
| 8 | # |
|---|
| 9 | # TODO: |
|---|
| 10 | # 1) Queue support to automate build process |
|---|
| 11 | # 2) bz2 packages? |
|---|
| 12 | |
|---|
| 13 | SVN_REPO_PATH="/svn/pkg-parsix/pkg/" |
|---|
| 14 | LOCAL_REPO_PATH="/home/parsix/public_html/packages/pool" |
|---|
| 15 | LOCAL_REPO_ROOT="/home/parsix/public_html/packages/" |
|---|
| 16 | SRC_PKG_NAME="$1" |
|---|
| 17 | DIST_NAME="$2" |
|---|
| 18 | UNDERLINE=$'\137' # 137 is octal ASCII code for '_' |
|---|
| 19 | |
|---|
| 20 | # Define some colors first: |
|---|
| 21 | GREEN="[1;32m" |
|---|
| 22 | YELLOW="[1;33m" |
|---|
| 23 | BLUE="[1;34m" |
|---|
| 24 | MAGENTA="[1;35m" |
|---|
| 25 | CYAN="[1;36m" |
|---|
| 26 | WHITE="[1;37m" |
|---|
| 27 | RED="[1;31m" |
|---|
| 28 | NORMAL="[0;39m" |
|---|
| 29 | |
|---|
| 30 | # Checking required inputs |
|---|
| 31 | if [ -z "$1" ]; then |
|---|
| 32 | echo "${GREEN}Couldn't detect source package name, exiting...${NORMAL}" |
|---|
| 33 | exit |
|---|
| 34 | fi |
|---|
| 35 | |
|---|
| 36 | if [ -z "$2" ]; then |
|---|
| 37 | echo "${GREEN}Couldn't detect distro name, exiting...${NORMAL}" |
|---|
| 38 | exit |
|---|
| 39 | fi |
|---|
| 40 | |
|---|
| 41 | cd $LOCAL_REPO_PATH |
|---|
| 42 | POOL=`find ./ -type d | grep $SRC_PKG_NAME | awk 'BEGIN{FS="/"}{print $3}'` |
|---|
| 43 | |
|---|
| 44 | cd $SVN_REPO_PATH |
|---|
| 45 | COMPONENT=`find ./ -maxdepth 2 -type d | grep /$SRC_PKG_NAME | awk 'BEGIN{FS="/"}{print $2}'` |
|---|
| 46 | |
|---|
| 47 | if [ ! -z "$COMPONENT" ]; then |
|---|
| 48 | echo "${GREEN}Detected component: ${YELLOW}$COMPONENT${NORMAL}" |
|---|
| 49 | else |
|---|
| 50 | echo "${GREEN}Couldn't detect component, exiting...${NORMAL}" |
|---|
| 51 | exit |
|---|
| 52 | fi |
|---|
| 53 | |
|---|
| 54 | if [ -d $SVN_REPO_PATH/$COMPONENT/$SRC_PKG_NAME ]; then |
|---|
| 55 | cd $SVN_REPO_PATH/$COMPONENT/$SRC_PKG_NAME |
|---|
| 56 | else |
|---|
| 57 | echo "${GREEN}SVN directory does not exists, exiting...${NORMAL}" |
|---|
| 58 | exit |
|---|
| 59 | fi |
|---|
| 60 | |
|---|
| 61 | if [ ! -f trunk/debian/watch ]; then |
|---|
| 62 | echo "${GREEN}Can't find watch file, exiting...${NORMAL}" |
|---|
| 63 | exit |
|---|
| 64 | fi |
|---|
| 65 | |
|---|
| 66 | # FIXME |
|---|
| 67 | chmod +x trunk/debian/rules |
|---|
| 68 | rm trunk/debian/control* &> /dev/null |
|---|
| 69 | |
|---|
| 70 | # Update SVN to the latest version |
|---|
| 71 | svn up &> /dev/null |
|---|
| 72 | |
|---|
| 73 | echo "${GREEN}Parsing changelog to get the latest prepared version...${NORMAL} " |
|---|
| 74 | PKG_VERSION=`dpkg-parsechangelog -ltrunk/debian/changelog | grep Version | awk 'BEGIN{FS=": "}{print $2}' | awk 'BEGIN{FS="-"}{print $1}' | awk 'BEGIN{FS=" "}{print $1}'` |
|---|
| 75 | PKG_REVISION=`dpkg-parsechangelog -ltrunk/debian/changelog | grep Version | awk 'BEGIN{FS=": "}{print $2}' | awk 'BEGIN{FS="-"}{print $2}'` |
|---|
| 76 | echo "${YELLOW}$PKG_VERSION-$PKG_REVISION${NORMAL}" |
|---|
| 77 | |
|---|
| 78 | echo "${GREEN}Getting the latest upstream...${NORMAL}" |
|---|
| 79 | UPSTREAM_VERSION=`uscan --report --dehs --check-dirname-level 0 trunk/ | grep upstream-version | awk 'BEGIN{FS=">"}{print $2}' | awk 'BEGIN{FS="<"}{print $1}'` |
|---|
| 80 | UPSTREAM_TARBALL_URL=`uscan --report --dehs --check-dirname-level 0 trunk/ | grep upstream-url | awk 'BEGIN{FS=">"}{print $2}' | awk 'BEGIN{FS="<"}{print $1}'` |
|---|
| 81 | echo "${YELLOW}$UPSTREAM_VERSION${NORMAL}" |
|---|
| 82 | |
|---|
| 83 | # Log filename |
|---|
| 84 | LOG_FILE="$LOCAL_REPO_ROOT../buildlogs/$SRC_PKG_NAME$UNDERLINE$UPSTREAM_VERSION-$PKG_REVISION.log" |
|---|
| 85 | |
|---|
| 86 | # Clean up log |
|---|
| 87 | rm $LOG_FILE &> /dev/null |
|---|
| 88 | |
|---|
| 89 | # clean up untarred packages |
|---|
| 90 | rm -r $SRC_PKG_NAME-* &> /dev/null |
|---|
| 91 | rm -r build-area/* &> /dev/null |
|---|
| 92 | rm *.tar.gz &> /dev/null |
|---|
| 93 | |
|---|
| 94 | # try to get upstream tarball using uscan |
|---|
| 95 | uscan --rename --no-dehs --check-dirname-level 0 trunk/ >> $LOG_FILE |
|---|
| 96 | |
|---|
| 97 | # if fails, try classic manual way |
|---|
| 98 | if [ ! -f $SRC_PKG_NAME$UNDERLINE$UPSTREAM_VERSION.orig.tar.gz ]; then |
|---|
| 99 | wget -c $UPSTREAM_TARBALL_URL &> /dev/null || exit 1 |
|---|
| 100 | mv `ls | grep tar.gz` $SRC_PKG_NAME$UNDERLINE$UPSTREAM_VERSION.orig.tar.gz -v >> $LOG_FILE |
|---|
| 101 | fi |
|---|
| 102 | |
|---|
| 103 | echo "${GREEN}Copying orig tarball to the local apt repo...${NORMAL}" |
|---|
| 104 | cp *.orig.tar.gz $LOCAL_REPO_PATH/$COMPONENT/$POOL/$SRC_PKG_NAME/ -v >> $LOG_FILE |
|---|
| 105 | |
|---|
| 106 | # Make tarballs |
|---|
| 107 | mkdir -p tarballs &> /dev/null |
|---|
| 108 | mkdir -p build-area &> /dev/null |
|---|
| 109 | |
|---|
| 110 | # Copy tarball |
|---|
| 111 | cp *.orig.tar.gz tarballs/ -v >> $LOG_FILE |
|---|
| 112 | |
|---|
| 113 | # Clean up untarred packages |
|---|
| 114 | rm -r $SRC_PKG_NAME-* &> /dev/null |
|---|
| 115 | |
|---|
| 116 | # Check if both tarballs exist |
|---|
| 117 | if [ ! -f tarballs/$SRC_PKG_NAME$UNDERLINE$UPSTREAM_VERSION.orig.tar.gz ]; then |
|---|
| 118 | echo "${RED}Source tarball not found${NORMAL}" && exit 3 |
|---|
| 119 | fi |
|---|
| 120 | |
|---|
| 121 | if [ ! -f $LOCAL_REPO_PATH/$COMPONENT/$POOL/$SRC_PKG_NAME/$SRC_PKG_NAME$UNDERLINE$UPSTREAM_VERSION.orig.tar.gz ]; then |
|---|
| 122 | echo "${RED}Source tarball not found on repo${NORMAL}" && exit 4 |
|---|
| 123 | fi |
|---|
| 124 | |
|---|
| 125 | # Goto trunk to start build |
|---|
| 126 | cd trunk/ |
|---|
| 127 | |
|---|
| 128 | # Fixing /etc/pbuilderrc |
|---|
| 129 | PXBUILDARCH="amd64" |
|---|
| 130 | sed -i s/base.tgz/base-$PXBUILDARCH.tgz/g /etc/pbuilderrc |
|---|
| 131 | |
|---|
| 132 | # Build amd64 chroot if needed |
|---|
| 133 | if [ ! -f /var/cache/pbuilder/base-$PXBUILDARCH.tgz ]; then |
|---|
| 134 | echo "${GREEN}Creating ${YELLOW}amd64${NORMAL} ${GREEN}chroot...${NORMAL}" |
|---|
| 135 | pbuilder --create --distribution lenny --override-config --debootstrap debootstrap --debootstrapopts --arch --debootstrapopts amd64 --logfile $LOG_FILE --mirror ftp://ftp.de.debian.org/debian --othermirror "deb http://parsix.org/packages ramon main contrib non-free" &> /dev/null || exit 5 |
|---|
| 136 | else |
|---|
| 137 | echo "${GREEN}Updating ${YELLOW}amd64${NORMAL} ${GREEN}chroot...${NORMAL}" |
|---|
| 138 | pbuilder --update --distribution lenny --override-config --debootstrap debootstrap --debootstrapopts --arch --debootstrapopts amd64 --logfile $LOG_FILE --mirror ftp://ftp.de.debian.org/debian --othermirror "deb http://parsix.org/packages ramon main contrib non-free" &> /dev/null || exit 5 |
|---|
| 139 | fi |
|---|
| 140 | |
|---|
| 141 | # Build amd64 packages |
|---|
| 142 | echo "${GREEN}Building ${YELLOW}amd64${NORMAL} ${GREEN}specific packages...${NORMAL}" |
|---|
| 143 | svn-buildpackage --svn-builder="pdebuild --use-pdebuild-internal -- --logfile $LOG_FILE" || exit 6 |
|---|
| 144 | |
|---|
| 145 | # Revert /etc/pbuilderrc changes |
|---|
| 146 | sed -i s/base-$PXBUILDARCH.tgz/base.tgz/g /etc/pbuilderrc |
|---|
| 147 | |
|---|
| 148 | # Fixing /etc/pbuilderrc |
|---|
| 149 | PXBUILDARCH="i386" |
|---|
| 150 | sed -i s/base.tgz/base-$PXBUILDARCH.tgz/g /etc/pbuilderrc |
|---|
| 151 | |
|---|
| 152 | # Build i386 chroot if needed |
|---|
| 153 | if [ ! -f /var/cache/pbuilder/base-$PXBUILDARCH.tgz ]; then |
|---|
| 154 | echo "${GREEN}Creating ${YELLOW}i386${NORMAL} ${GREEN}chroot...${NORMAL}" |
|---|
| 155 | pbuilder --create --distribution lenny --override-config --debootstrap debootstrap --debootstrapopts --arch --debootstrapopts i386 --logfile $LOG_FILE --mirror ftp://ftp.de.debian.org/debian --othermirror "deb http://parsix.org/packages ramon main contrib non-free" &> /dev/null || exit 7 |
|---|
| 156 | else |
|---|
| 157 | echo "${GREEN}Updating ${YELLOW}i386${NORMAL} ${GREEN}chroot...${NORMAL}" |
|---|
| 158 | pbuilder --update --distribution lenny --override-config --debootstrap debootstrap --debootstrapopts --arch --debootstrapopts i386 --logfile $LOG_FILE --mirror ftp://ftp.de.debian.org/debian --othermirror "deb http://parsix.org/packages ramon main contrib non-free" &> /dev/null || exit 7 |
|---|
| 159 | fi |
|---|
| 160 | |
|---|
| 161 | # Restore default controls |
|---|
| 162 | rm debian/control* &> /dev/null |
|---|
| 163 | svn up &> /dev/null |
|---|
| 164 | |
|---|
| 165 | # Build i386 packages |
|---|
| 166 | echo "${GREEN}Building ${YELLOW}i386${NORMAL} ${GREEN}specific packages...${NORMAL}" |
|---|
| 167 | svn-buildpackage --svn-builder="pdebuild --use-pdebuild-internal --debbuildopts -B -- --logfile $LOG_FILE" || exit 7 |
|---|
| 168 | |
|---|
| 169 | # Revert /etc/pbuilderrc changes |
|---|
| 170 | sed -i s/base-$PXBUILDARCH.tgz/base.tgz/g /etc/pbuilderrc |
|---|
| 171 | |
|---|
| 172 | cd ../build-area/ |
|---|
| 173 | |
|---|
| 174 | echo "${GREEN}Generating ${YELLOW}multi_arch${NORMAL} ${GREEN}changes file and centralizing packages...${NORMAL}" |
|---|
| 175 | |
|---|
| 176 | # Merging changes file for multiarch upload |
|---|
| 177 | AMD64_CHANGES=`ls | grep _amd64.changes` |
|---|
| 178 | I386_CHANGES=`ls | grep _i386.changes` |
|---|
| 179 | mergechanges -f $AMD64_CHANGES $I386_CHANGES >> $LOG_FILE |
|---|
| 180 | |
|---|
| 181 | # Add package to the repo |
|---|
| 182 | cd $LOCAL_REPO_ROOT |
|---|
| 183 | reprepro -Vb . include $DIST_NAME $SVN_REPO_PATH/$COMPONENT/$SRC_PKG_NAME/build-area/`ls $SVN_REPO_PATH/$COMPONENT/$SRC_PKG_NAME/build-area/ | grep _multi.changes` >> $LOG_FILE |
|---|
| 184 | sh ../../sign >> $LOG_FILE && cd |
|---|
| 185 | |
|---|
| 186 | echo "${GREEN}Finished.${NORMAL}" |
|---|
| 187 | |
|---|