source: projects/self-build-setup/trunk/self-build-rpm.sh @ 427

Revision 427, 4.8 KB checked in by kazutaka, 14 years ago (diff)

最後の引数がログのファイルサイズじゃ無い時(=ログサイズが不明の場合)でも動作するように修正。
(zenity 対応は次に実施する予定です)

  • Property svn:executable set to *
Line 
1#!/bin/bash
2#
3# Helper script for self-build rpm package.
4# arguments 1:package name, 2:spec file, 3 and on: source url
5#
6# NOTE: To avoid scriptlet failure during rpm transaction,
7#       This script should always return 0 even if there is an error.
8
9TEXTDOMAIN=self-build-setup
10TEXTDOMAINDIR=/usr/share/locale
11
12_NAME=$1
13_SPEC=$2
14_ARCH=$(rpm --eval %_arch)
15_QUEDIR=/var/cache/self-build
16
17#
18# bar() : function to draw text-base progress bar
19#
20
21BAR_W=$((`tput cols`-20))
22COUNT=0
23LINES=0
24
25bar(){
26   while read line; do
27      let $((COUNT+=${#line}))
28      let $((LINES+=1))
29      if [ $(($LINES % 10)) = 0 ]; then
30         if [ $_BASE_SIZE -gt 0 ]; then
31            PERCENT=$((100*COUNT/_BASE_SIZE))
32            [ $PERCENT -gt 100 ] && PERCENT=100
33            BAR_LEFT=$((BAR_W*PERCENT/100))
34            printf "     %3d%%[" $PERCENT
35            for i in $(seq 1 $BAR_LEFT); do
36               printf "="
37            done
38            printf ">"
39            for i in $(seq 1 $((BAR_W-BAR_LEFT))); do
40               printf " "
41            done
42            printf "]\r"
43         else
44            printf "      ??%%["
45            for i in $(seq 1 $(($LINES / 10))); do
46               printf "="
47            done
48            printf ">]\r"
49         fi
50      fi
51   done
52   printf "\n"
53}
54
55
56#
57# main
58#
59
60. /etc/self-build.conf
61
62
63echo -n "     "
64echo -n $"Start creating rpm packages."
65echo "($_NAME)"
66
67# create temporary rpm directory
68if ! _TOPDIR=`mktemp -d $TEMP_DIR/$_NAME.XXXXXX`; then
69    echo -n "     "
70    echo $"*ERROR: can't crete temporary directory."
71    exit 0
72fi
73mkdir $_TOPDIR/rpm
74mkdir $_TOPDIR/rpm/BUILD
75mkdir $_TOPDIR/rpm/RPMS
76mkdir $_TOPDIR/rpm/RPMS/$_ARCH
77mkdir $_TOPDIR/rpm/RPMS/noarch
78mkdir $_TOPDIR/rpm/SOURCES
79
80# copy patches and other files.
81cp -a /usr/share/$_NAME/* $_TOPDIR/rpm/SOURCES
82
83# check last argument and set build log size
84eval LAST=\$\{$(expr $#)\}
85if echo $LAST | grep -E '^[0-9]+$' > /dev/null 2>&1; then
86    _BASE_SIZE=$LAST
87else
88    _BASE_SIZE=0
89fi
90
91# get source
92
93echo -n "     "
94echo $"Downloading source files..."
95shift 2
96for u in $@; do
97    # if not valid url (http: or ftp:) then skip
98    if ! echo $u | grep "tp:"; then
99        continue
100    fi
101
102    _SRC=$_TOPDIR/rpm/SOURCES/$(basename $u)
103    [ -s $_SRC ] && continue
104
105    if [ ! $DL_SHOW_PROGRESS = "yes" ]; then
106        # run quiet, no GUI
107        wget -q -P $_TOPDIR/rpm/SOURCES $u
108        RESULT=$?
109    elif [ -z `pgrep -n synaptic` ]; then
110        # run verbose, without GUI (because no synaptic running)
111        wget -P $_TOPDIR/rpm/SOURCES $u
112        RESULT=$?
113    else
114        # run verbose with GUI (zenity)
115        wget -P $_TOPDIR/rpm/SOURCES $u 2>&1 | \
116             sed -u 's/.* \+\([0-9]\+%\).*$/\1/' 2>/dev/null | \
117             zenity --auto-close --progress \
118                     --title $"Download files" \
119                     --text $"Downloading $(basename $u)..." &
120
121        # workaround for killing remaining wget process when cancel button pressed.
122        WGETPID=`pgrep -f "wget -P $_TOPDIR/rpm/SOURCES $u"`
123        ZENITYPID=$!                        # last child pid = zenity pid
124        RESULT=0                            # hold exit status of zenity
125
126        RUNNING=0
127        while [ $RUNNING -eq 0 ]
128        do
129            sleep 1
130            if [ -z `ps -p $ZENITYPID -o pid=` ]; then
131                if [ `ps -p $WGETPID -o pid=` ]; then
132                    # if zenity exited but wget still running,
133                    # then we suppose that zenity is cancelled by user.
134                    sleep 3
135                    kill -KILL $WGETPID
136                    RESULT=1
137                fi
138            RUNNING=1
139            fi
140        done
141    fi
142    [ $RESULT -ne 0 -a -e $_SRC ] && rm -f $_SRC   
143done
144for f in $(echo $@ | xargs -r -n1 basename|sort -u|grep "tp:"); do
145    if [ ! -s $_TOPDIR/rpm/SOURCES/$f ]; then
146        echo -n "     "
147        echo $"*ERROR: can't download source file."": $f"
148        rm -rf $_TOPDIR
149        exit 0
150    fi
151done
152echo -n "     "
153echo $"Source files download successfully."
154
155# build rpm package
156echo -n "     "
157echo $"Building rpm packages..."
158echo -n "      "
159echo $"(see $TEMP_DIR/$_NAME.log for detail.)"
160# now rpmbuild done by non-root user $BUILD_USER
161rm -f $TEMP_DIR/$_NAME.log
162chown -R $BUILD_USER:$BUILD_USER $_TOPDIR
163
164su $BUILD_USER -c "rpmbuild -bb --define=\"_topdir $_TOPDIR/rpm\" /usr/share/$_NAME/$_SPEC" 2>&1 | tee $TEMP_DIR/$_NAME.log | bar
165
166if [ ${PIPESTATUS[0]} -eq 0 ] ; then
167    echo -n "     "
168    echo $"rpm packages are successfully built."
169    if ls $_TOPDIR/rpm/RPMS/$_ARCH | grep -e "\.rpm$" > /dev/null ; then
170        mv -f $_TOPDIR/rpm/RPMS/$_ARCH/*.rpm $_QUEDIR
171    fi
172    if ls $_TOPDIR/rpm/RPMS/noarch | grep -e "\.rpm$" > /dev/null ; then
173        mv -f $_TOPDIR/rpm/RPMS/noarch/*.rpm $_QUEDIR
174    fi
175    rm -rf $_TOPDIR
176else
177    echo -n "     "
178    echo $"*ERROR: can't build rpm packages."
179    rm -rf $_TOPDIR
180    exit 0
181fi
182exit 0
Note: See TracBrowser for help on using the repository browser.