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

Revision 428, 5.0 KB checked in by kazutaka, 14 years ago (diff)

ログサイズ不明の場合に、プログレスバーが右端までいったら改行して頭から描画するように変更

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