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

Revision 425, 4.5 KB checked in by kazutaka, 14 years ago (diff)

CUI でプログレスバーを出すように変更。
最後の引数にファイルサイズを付けることで動作する。
(付けないとエラーになるのは後で修正します…。)

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