VERSION="\
Build package utility from PLD Linux CVS repository
-v0.15 (C) 1999-2006 Free Penguins".
+v0.16 (C) 1999-2006 Free Penguins".
PATH="/bin:/usr/bin:/usr/sbin:/sbin:/usr/X11R6/bin"
COMMAND="build"
CVSTAG=""
RES_FILE=""
+CVS_FORCE=""
CVS_SERVER="cvs.pld-linux.org"
DISTFILES_SERVER="://distfiles.pld-linux.org"
# let get_files skip over files which are present to get those damn files fetched
SKIP_EXISTING_FILES="no"
+TRY_UPGRADE=""
+# should the specfile be restored if upgrade failed?
+REVERT_BROKEN_UPGRADE="yes"
+
if [ -x /usr/bin/rpm-getdeps ]; then
- FETCH_BUILD_REQUIRES_RPMGETDEPS="yes"
+ FETCH_BUILD_REQUIRES_RPMGETDEPS="yes"
else
- FETCH_BUILD_REQUIRES_RPMGETDEPS="no"
+ FETCH_BUILD_REQUIRES_RPMGETDEPS="no"
fi
# Here we load saved user environment used to
[ -f "$USER_CFG" ] && . "$USER_CFG"
-wget --help 2>&1 | grep -q ' \-\-no-check\-certificate ' && WGET_OPTS="$WGET_OPTS --no-check-certificate"
-
if [ "$SCHEDTOOL" = "auto" ]; then
if [ -x /usr/bin/schedtool ] && schedtool -B -e echo >/dev/null; then
SCHEDTOOL="schedtool -B -e"
GETURI2="$GETURI"
OUTFILEOPT="-o"
else
- wget --help 2>&1 | grep -q ' \-\-inet ' && WGET_OPTS="$WGET_OPTS --inet"
- wget --help 2>&1 | grep -q ' \-\-retry\-connrefused ' && WGET_OPTS="$WGET_OPTS --retry-connrefused"
+ wget --help 2>&1 | grep -q -- ' --no-check-certificate ' && WGET_OPTS="$WGET_OPTS --no-check-certificate"
+ wget --help 2>&1 | grep -q -- ' --inet ' && WGET_OPTS="$WGET_OPTS --inet"
+ wget --help 2>&1 | grep -q -- ' --retry-connrefused ' && WGET_OPTS="$WGET_OPTS --retry-connrefused"
GETURI="wget --passive-ftp -c -nd -t$WGET_RETRIES $WGET_OPTS"
GETURI2="wget -c -nd -t$WGET_RETRIES $WGET_OPTS"
if [ -n "$DEBUG" ]; then set -xv; fi
echo "\
Usage: builder [-D|--debug] [-V|--version] [-a|--as_anon] [-b|-ba|--build]
-
[-bb|--build-binary] [-bs|--build-source] [-u|--try-upgrade]
-[{-B|--branch} <branch>] [{-d|--cvsroot} <cvsroot>] [-g|--get]
-[-h|--help] [--http] [{-l,--logtofile} <logfile>] [-m|--mr-proper]
+[{-cf|--cvs-force}] [{-B|--branch} <branch>] [{-d|--cvsroot} <cvsroot>]
+[-g|--get] [-h|--help] [--http] [{-l,--logtofile} <logfile>] [-m|--mr-proper]
[-q|--quiet] [--date <yyyy-mm-dd> [-r <cvstag>] [{-T--tag <cvstag>]
-[-Tvs|--tag-version-stable] [-Tvn|--tag-version-nest]
-[-Ts|--tag-stable] [-Tn|--tag-nest] [-Tv|--tag-version]
+[-Tvs|--tag-version-stable] [-Ts|--tag-stable] [-Tv|--tag-version]
[{-Tp|--tag-prefix} <prefix>] [{-tt|--test-tag}]
[-nu|--no-urls] [-v|--verbose] [--opts <rpm opts>] [--show-bconds]
[--with/--without <feature>] [--define <macro> <value>] <package>[.spec][:cvstag]
-B, --branch - add branch
-c, --clean - clean all temporarily created files (in BUILD, SOURCES,
SPECS and \$RPM_BUILD_ROOT),
+-cf, --cvs-force - use -F when tagging (useful when moving branches)
-d <cvsroot>, --cvsroot <cvsroot>
- setup \$CVSROOT,
--define <macro> <value>
- add cvs tag <cvstag> for files,
-Tvs, --tag-version-stable
- add cvs tags STABLE and NAME-VERSION-RELEASE for files,
--Tvn, --tag-version-nest
- - add cvs tags NEST and NAME-VERSION-RELEASE for files,
-Ts, --tag-stable
- add cvs tag STABLE for files,
--Tn, --tag-nest
- - add cvs tag NEST for files,
-Tv, --tag-version
- add cvs tag NAME-VERSION-RELEASE for files,
-Tp, --tag-prefix <prefix>
# set TARGET from BuildArch: from SPECFILE
set_spec_target() {
- if [ -n "$SPECFILE" ] && [ -z "$TARGET" ]; then
- tmp=$(awk '/^BuildArch:/ { print $NF}' $SPECFILE)
- if [ "$tmp" ]; then
+ if [ -n "$SPECFILE" ] && [ -z "$TARGET" ]; then
+ tmp=$(awk '/^BuildArch:/ { print $NF}' $SPECFILE)
+ if [ "$tmp" ]; then
TARGET="$tmp"
case "$RPMBUILD" in
"rpmbuild")
- TARGET_SWITCH="--target $TARGET" ;;
+ TARGET_SWITCH="--target $TARGET" ;;
"rpm")
- TARGET_SWITCH="--target=$TARGET" ;;
+ TARGET_SWITCH="--target=$TARGET" ;;
esac
- fi
- fi
+ fi
+ fi
}
cache_rpm_dump () {
- if [ -n "$DEBUG" ]; then
- set -x;
- set -v;
- fi
+ if [ -n "$DEBUG" ]; then
+ set -x;
+ set -v;
+ fi
update_shell_title "cache_rpm_dump"
local rpm_dump
ARGS='--nodigest --nosignature --nobuild'
;;
esac
- if [ "$NOINIT" != "yes" ] ; then
- ARGDIRS=''
- else
- ARGDIRS='--define "_specdir ." --define "_sourcedir ."'
+ if [ "$NOINIT" = "yes" ] ; then
+ cat >> .builder-rpmmacros <<'EOF'
+%_specdir ./
+%_sourcedir ./
+EOF
fi
$RPMBUILD --rcfile .builder-rpmrc $ARGS $ARGDIRS --nodeps --define "prep $dump" $BCOND $TARGET_SWITCH $SPECFILE 2>&1
`
rpm_dump () {
if [ -z "$rpm_dump_cache" ] ; then
- echo "internal error: cache_rpm_dump not called!" 1>&2
+ echo "internal error: cache_rpm_dump not called! (missing %prep?)" 1>&2
fi
echo "$rpm_dump_cache"
}
return
fi
- rpm_dump_cache="böö" NODIST="yes" UPDATE5= get_files $ICONS
+ rpm_dump_cache="kalasaba" NODIST="yes" get_files $ICONS
}
parse_spec()
remove_build_requires
echo "Error: couldn't get out package name/version/release from spec file."
exit 6 ;;
- "err_tag_exists" )
+ "err_tag_exists" )
remove_build_requires
echo "Tag ${2} already exists (spec release: ${3}).";
exit 9 ;;
- "err_fract_rel" )
+ "err_fract_rel" )
remove_build_requires
echo "Release ${2} not integer and not a snapshot.";
exit 10 ;;
exit 11 ;;
esac
- echo "Unknown error."
- exit 100
+ echo "Unknown error."
+ exit 100
}
init_builder()
unset OPTIONS
[ -n "$DONT_PRINT_REVISION" ] || grep -E -m 1 "^#.*Revision:.*Date" $SPECFILE
- set_spec_target
+ set_spec_target
}
find_mirror()
{
cd "$SPECS_DIR"
- url="$1"
+ local url="$1"
if [ ! -f "mirrors" -a "$NOCVSSPEC" != "yes" ] ; then
cvs update mirrors >&2
fi
IFS="|"
- while read origin mirror name rest
- do
+ local origin mirror name rest ol prefix
+ while read origin mirror name rest; do
+ # skip comments and empty lines
+ if [ -z "$origin" ] || [[ $origin == \#* ]]; then
+ continue
+ fi
ol=`echo -n "$origin"|wc -c`
prefix="`echo -n "$url" | head -c $ol`"
if [ "$prefix" = "$origin" ] ; then
- suffix="`echo "$url"|cut -b $ol-`"
+ suffix="`echo "$url"|cut -b $((ol+1))-`"
echo -n "$mirror$suffix"
return 0
fi
echo "$url"
}
+# Warning: unpredictable results if same URL used twice
src_no ()
{
cd $SPECS_DIR
head -n 1 | xargs
}
-src_md5 ()
+src_md5()
{
- [ X"$NO5" = X"yes" ] && return
+ [ "$NO5" = "yes" ] && return
no=$(src_no "$1")
[ -z "$no" ] && return
cd $SPECS_DIR
- spec_rev=$(grep $SPECFILE CVS/Entries 2>/dev/null | sed -e s:/$SPECFILE/:: -e s:/.*::)
- if [ -z "$spec_rev" ]; then
- spec_rev="$(head -n 1 $SPECFILE | sed -e 's/.*\$Revision: \([0-9.]*\).*/\1/')"
- fi
- spec="$SPECFILE[0-9.,]*,$(echo $spec_rev | sed 's/\./\\./g')"
- md5=$(grep -s -v '^#' additional-md5sums | \
- grep -E "[ ]$(basename "$1")[ ]+${spec}([ ,]|\$)" | \
- sed -e 's/^\([0-9a-f]\{32\}\).*/\1/' | \
- grep -E '^[0-9a-f]{32}$')
- if [ X"$md5" = X"" ] ; then
- source_md5=`grep -i "#[ ]*Source$no-md5[ ]*:" $SPECFILE | sed -e 's/.*://'`
- if [ ! -z "$source_md5" ] ; then
- echo $source_md5;
- else
- # we have empty SourceX-md5, but it is still possible
- # that we have NoSourceX-md5 AND NoSource: X
- nosource_md5=`grep -i "#[ ]*NoSource$no-md5[ ]*:" $SPECFILE | sed -e 's/.*://'`
- if [ ! -z "$nosource_md5" -a ! X"`grep -i "^NoSource:[ ]*$no$" $SPECFILE`" = X"" ] ; then
- echo $nosource_md5;
- fi;
- fi;
+ local md5
+
+ if [ -f additional-md5sums ]; then
+ local spec_rev=$(grep $SPECFILE CVS/Entries 2>/dev/null | sed -e s:/$SPECFILE/:: -e s:/.*::)
+ if [ -z "$spec_rev" ]; then
+ spec_rev="$(head -n 1 $SPECFILE | sed -e 's/.*\$Revision: \([0-9.]*\).*/\1/')"
+ fi
+ local spec="$SPECFILE[0-9.,]*,$(echo $spec_rev | sed 's/\./\\./g')"
+ md5=$(grep -s -v '^#' additional-md5sums | \
+ grep -E "[ ]$(basename "$1")[ ]+${spec}([ ,]|\$)" | \
+ sed -e 's/^\([0-9a-f]\{32\}\).*/\1/' | \
+ grep -E '^[0-9a-f]{32}$')
+
+ if [ "$md5" ]; then
+ if [ $(echo "$md5" | wc -l) != 1 ] ; then
+ echo "$SPECFILE: more then one entry in additional-md5sums for $1" 1>&2
+ fi
+ echo "$md5" | tail -n 1
+ return
+ fi
+ fi
+
+ source_md5=`grep -i "#[ ]*Source$no-md5[ ]*:" $SPECFILE | sed -e 's/.*://'`
+ if [ -n "$source_md5" ]; then
+ echo $source_md5
else
- if [ $(echo "$md5" | wc -l) != 1 ] ; then
- echo "$SPECFILE: more then one entry in additional-md5sums for $1" 1>&2
+ # we have empty SourceX-md5, but it is still possible
+ # that we have NoSourceX-md5 AND NoSource: X
+ nosource_md5=`grep -i "#[ ]*NoSource$no-md5[ ]*:" $SPECFILE | sed -e 's/.*://'`
+ if [ -n "$nosource_md5" -a -n "`grep -i "^NoSource:[ ]*$no$" $SPECFILE`" ] ; then
+ echo $nosource_md5
fi
- echo "$md5" | tail -n 1
fi
}
good_size ()
{
- size="$(find $(nourl "$1") -printf "%s" 2>/dev/null)"
- [ -n "$size" -a "$size" -gt 0 ]
+ size="$(find $(nourl "$1") -printf "%s" 2>/dev/null)"
+ [ -n "$size" -a "$size" -gt 0 ]
}
cvsignore_df ()
cvsup()
{
- update_shell_title "cvsup"
- local OPTIONS="up "
- if [ -n "$CVSROOT" ]; then
- OPTIONS="-d $CVSROOT $OPTIONS"
- fi
-
- if [ -z "$CVSDATE" -a -z "$CVSTAG" ]; then
- OPTIONS="$OPTIONS -A"
- else
- if [ -n "$CVSDATE" ]; then
- OPTIONS="$OPTIONS -D $CVSDATE"
- fi
- if [ -n "$CVSTAG" ]; then
- OPTIONS="$OPTIONS -r $CVSTAG"
- fi
- fi
-
- local result=1
- local retries_counter=0
- if [ $# = 1 ]; then
- update_shell_title "cvsup: $*"
- else
- update_shell_title "cvsup: $# files"
- fi
- while [ "$result" != "0" -a "$retries_counter" -le "$CVS_RETRIES" ]; do
- retries_counter=$(( $retries_counter + 1 ))
- output=$(LC_ALL=C cvs $OPTIONS "$@" 2>&1)
- result=$?
- [ -n "$output" ] && echo "$output"
- if (echo "$output" | grep -qE "(Cannot connect to|connect to .* failed|Connection reset by peer|Connection timed out|Unknown host)") && [ "$result" -ne "0" -a "$retries_counter" -le "$CVS_RETRIES" ]; then
- echo "Trying again [$*]... ($retries_counter)"
- update_shell_title "cvsup: retry #$retries_counter"
- sleep 2
- continue
- else
- break
- fi
- done
- update_shell_title "cvsup: done!"
- return $result
+ update_shell_title "cvsup"
+ local OPTIONS="up "
+ if [ -n "$CVSROOT" ]; then
+ OPTIONS="-d $CVSROOT $OPTIONS"
+ fi
+
+ if [ -z "$CVSDATE" -a -z "$CVSTAG" ]; then
+ OPTIONS="$OPTIONS -A"
+ else
+ if [ -n "$CVSDATE" ]; then
+ OPTIONS="$OPTIONS -D $CVSDATE"
+ fi
+ if [ -n "$CVSTAG" ]; then
+ OPTIONS="$OPTIONS -r $CVSTAG"
+ fi
+ fi
+
+ local result=1
+ local retries_counter=0
+ if [ $# = 1 ]; then
+ update_shell_title "cvsup: $*"
+ else
+ update_shell_title "cvsup: $# files"
+ fi
+ while [ "$result" != "0" -a "$retries_counter" -le "$CVS_RETRIES" ]; do
+ retries_counter=$(( $retries_counter + 1 ))
+ output=$(LC_ALL=C cvs $OPTIONS "$@" 2>&1)
+ result=$?
+ [ -n "$output" ] && echo "$output"
+ if (echo "$output" | grep -qE "(Cannot connect to|connect to .* failed|Connection reset by peer|Connection timed out|Unknown host)") && [ "$result" -ne "0" -a "$retries_counter" -le "$CVS_RETRIES" ]; then
+ echo "Trying again [$*]... ($retries_counter)"
+ update_shell_title "cvsup: retry #$retries_counter"
+ sleep 2
+ continue
+ else
+ break
+ fi
+ done
+ update_shell_title "cvsup: done!"
+ return $result
+}
+
+update_md5()
+{
+ if [ $# -eq 0 ]; then
+ return
+ fi
+
+ update_shell_title "update md5"
+ if [ -n "$DEBUG" ]; then
+ set -x;
+ set -v;
+ fi
+
+ cd "$SOURCE_DIR"
+
+ # pass 1: check files to be fetched
+ local todo
+ local need_files
+ for i in "$@"; do
+ local fp=$(nourl "$i")
+ local srcno=$(src_no "$i")
+ if [ -n "$UPDATE5" ]; then
+ if [ -n "$ADD5" ]; then
+ [ "$fp" = "$i" ] && continue # FIXME what is this check doing?
+ grep -qiE '^#[ ]*Source'$srcno'-md5[ ]*:' $SPECS_DIR/$SPECFILE && continue
+ else
+ grep -qiE '^#[ ]*Source'$srcno'-md5[ ]*:' $SPECS_DIR/$SPECFILE || continue
+ fi
+ fi
+ if [ ! -f "$fp" ] || [ $ALWAYS_CVSUP = "yes" ]; then
+ need_files="$need_files $i"
+ fi
+ done
+
+ # pass 1a: get needed files
+ if [ "$need_files" ]; then
+ get_files $need_files
+ fi
+
+ # pass 2: proceed with md5 adding or updating
+ for i in "$@"; do
+ local fp=$(nourl "$i")
+ local srcno=$(src_no "$i")
+ if [ -n "$UPDATE5" ] && \
+ ( ( [ -n "$ADD5" ] && echo $i | grep -q -E 'ftp://|http://|https://' && \
+ [ -z "$(grep -E -i '^NoSource[ ]*:[ ]*'$i'([ ]|$)' $SPECS_DIR/$SPECFILE)" ] ) || \
+ grep -q -i -E '^#[ ]*source'$srcno'-md5[ ]*:' $SPECS_DIR/$SPECFILE )
+ then
+ echo "Updating source-$srcno md5."
+ md5=$(md5sum "$fp" | cut -f1 -d' ')
+ perl -i -ne '
+ print unless /^\s*#\s*Source'$srcno'-md5\s*:/i;
+ print "# Source'$srcno'-md5:\t'$md5'\n"
+ if /^Source'$srcno'\s*:\s+/;
+ ' \
+ $SPECS_DIR/$SPECFILE
+ fi
+ done
+}
+
+check_md5()
+{
+ update_shell_title "check md5"
+
+ for i in "$@"; do
+ if good_md5 "$i" && good_size "$i"; then
+ continue
+ fi
+
+ echo "MD5 sum mismatch or 0 size. Use -U to refetch sources,"
+ echo "or -5 to update md5 sums, if you're sure files are correct."
+ Exit_error err_no_source_in_repo $i
+ done
}
get_files()
SHELL_TITLE_PREFIX="get_files[$nc/$#]"
update_shell_title "$i"
local fp=`nourl "$i"`
- if [ -f "$fp" ] && [ "$SKIP_EXISTING_FILES" = "yes" ]; then
- continue
- fi
- if [ -n "$UPDATE5" ]; then
- if [ -n "$ADD5" ]; then
- [ "$fp" = "$i" ] && continue
- grep -qiE '^#[ ]*Source'$(src_no $i)'-md5[ ]*:' $SPECS_DIR/$SPECFILE && continue
- else
- grep -qiE '^#[ ]*Source'$(src_no $i)'-md5[ ]*:' $SPECS_DIR/$SPECFILE || continue
- fi
+ if [ "$SKIP_EXISTING_FILES" = "yes" ] && [ -f "$fp" ]; then
+ continue
fi
+
FROM_DISTFILES=0
+ local srcmd5=$(src_md5 "$i")
+
+ # we know if source/patch is present in cvs/distfiles
+ # - has md5 (in distfiles)
+ # - in cvs... ideas?
+
+ # CHECK: local file didn't exist or always cvs up (first) requested.
if [ ! -f "$fp" ] || [ $ALWAYS_CVSUP = "yes" ]; then
if echo $i | grep -vE '(http|ftp|https|cvs|svn)://' | grep -qE '\.(gz|bz2)$']; then
echo "Warning: no URL given for $i"
fi
- if [ -z "$NODIST" ] && [ -n "$(src_md5 "$i")" ]; then
+ if [ -z "$NODIST" ] && [ -n "$srcmd5" ]; then
if good_md5 "$i" && good_size "$i"; then
- echo "$(nourl "$i") having proper md5sum already exists"
+ echo "$fp having proper md5sum already exists"
continue
fi
target="$fp"
url=$(distfiles_url "$i")
url_attic=$(distfiles_attic_url "$i")
FROM_DISTFILES=1
- if [ "`echo $url | grep -E '^(\.|/)'`" ]; then
+ # is $url local file?
+ if [[ "$url" = [./]* ]]; then
update_shell_title "${GETLOCAL%% *}: $url"
${GETLOCAL} $url $target
else
${GETURI2} ${OUTFILEOPT} "$target" "$url"
fi
fi
- if ! test -s "$target"; then
+
+ # is it empty file?
+ if [ ! -s "$target" ]; then
rm -f "$target"
if [ `echo $url_attic | grep -E '^(\.|/)'` ]; then
update_shell_title "${GETLOCAL%% *}: $url_attic"
update_shell_title "${GETURI%% *}: $url_attic"
${GETURI} ${OUTFILEOPT} "$target" "$url_attic" || \
if [ "`echo $url_attic | grep -E 'ftp://'`" ]; then
- update_shell_title "${GETURI2%% *}: $url_attic"
+ update_shell_title "${GETURI2%% *}: $url_attic"
${GETURI2} ${OUTFILEOPT} "$target" "$url_attic"
fi
fi
fi
- if test -s "$target"; then
+
+ if [ -s "$target" ]; then
cvsignore_df $target
else
rm -f "$target"
FROM_DISTFILES=0
fi
- elif [ "$NOCVS" != "yes" -a -z "$(src_md5 "$i")" ]; then
+ elif [ "$NOCVS" != "yes" -a -z "$srcmd5" ]; then
if [ $# -gt 1 ]; then
get_files_cvs="$get_files_cvs $fp"
update_shell_title "$fp (will cvs up later)"
else
im="$i"
fi
- update_shell_title "${GETURI%% *}: $im"
+ update_shell_title "${GETURI%% *}: $im"
${GETURI} "$im" || \
if [ "`echo $im | grep -E 'ftp://'`" ]; then
- update_shell_title "${GETURI2%% *}: $im"
+ update_shell_title "${GETURI2%% *}: $im"
${GETURI2} "$im"
fi
fi
fi
fi
- srcno=$(src_no $i)
+
+ # the md5 check must be moved elsewhere as if we've called from update_md5 the md5 is wrong.
if [ ! -f "$fp" -a "$FAIL_IF_NO_SOURCES" != "no" ]; then
Exit_error err_no_source_in_repo $i;
- elif [ -n "$UPDATE5" ] && \
- ( ( [ -n "$ADD5" ] && echo $i | grep -q -E 'ftp://|http://|https://' && \
- [ -z "$(grep -E -i '^NoSource[ ]*:[ ]*'$i'([ ]|$)' $SPECS_DIR/$SPECFILE)" ] ) || \
- grep -q -i -E '^#[ ]*source'$(src_no $i)'-md5[ ]*:' $SPECS_DIR/$SPECFILE )
- then
- echo "Updating source-$srcno md5."
- md5=$(md5sum "$fp" | cut -f1 -d' ')
- perl -i -ne '
- print unless /^\s*#\s*Source'$srcno'-md5\s*:/i;
- print "# Source'$srcno'-md5:\t'$md5'\n"
- if /^Source'$srcno'\s*:\s+/;
- ' \
- $SPECS_DIR/$SPECFILE
fi
+ # we check md5 here just only to refetch immediately
if good_md5 "$i" && good_size "$i"; then
:
elif [ "$FROM_DISTFILES" = 1 ]; then
update_shell_title "${GETURI%% *}: $url"
${GETURI} ${OUTFILEOPT} "$target" "$url" || \
if [ "`echo $url | grep -E 'ftp://'`" ]; then
- update_shell_title "${GETURI2%% *}: $url"
+ update_shell_title "${GETURI2%% *}: $url"
${GETURI2} ${OUTFILEOPT} "$target" "$url"
fi
- if ! test -s "$target"; then
+ if [ ! -s "$target" ]; then
rm -f "$target"
update_shell_title "${GETURI%% *}: $url_attic"
${GETURI} ${OUTFILEOPT} "$target" "$url_attic" || \
if [ "`echo $url_attic | grep -E 'ftp://'`" ]; then
- update_shell_title "${GETURI2%% *}: $url_attic"
+ update_shell_title "${GETURI2%% *}: $url_attic"
${GETURI2} ${OUTFILEOPT} "$target" "$url_attic"
fi
fi
test -s "$target" || rm -f "$target"
fi
-
- if good_md5 "$i" && good_size "$i" ; then
- :
- else
- echo "MD5 sum mismatch or 0 size. Use -U to refetch sources,"
- echo "or -5 to update md5 sums, if you're sure files are correct."
- Exit_error err_no_source_in_repo $i
- fi
done
SHELL_TITLE_PREFIX=""
if [ "$get_files_cvs" ]; then
- cvsup $get_files_cvs
+ cvsup $get_files_cvs
fi
if [ "$CHMOD" = "yes" ]; then
}
make_tagver() {
+ if [ -n "$DEBUG" ]; then
+ set -x;
+ set -v;
+ fi
- if [ -n "$DEBUG" ]; then
- set -x;
- set -v;
- fi
-
- # Check whether first character of PACKAGE_NAME is legal for tag name
- if [ -z "${PACKAGE_NAME##[_0-9]*}" -a -z "$TAG_PREFIX" ]; then
- TAG_PREFIX=tag_
- fi
- TAGVER=$TAG_PREFIX$PACKAGE_NAME-`echo $PACKAGE_VERSION | sed -e "s/\./\_/g" -e "s/@/#/g"`-`echo $PACKAGE_RELEASE | sed -e "s/\./\_/g" -e "s/@/#/g"`
- # Remove #kernel.version_release from TAGVER because tagging sources
- # could occur with different kernel-headers than kernel-headers used at build time.
- TAGVER=$(echo "$TAGVER" | sed -e 's/#.*//g')
- echo -n "$TAGVER"
+ # Check whether first character of PACKAGE_NAME is legal for tag name
+ if [ -z "${PACKAGE_NAME##[_0-9]*}" -a -z "$TAG_PREFIX" ]; then
+ TAG_PREFIX=tag_
+ fi
+ TAGVER=$TAG_PREFIX$PACKAGE_NAME-`echo $PACKAGE_VERSION | sed -e "s/\./\_/g" -e "s/@/#/g"`-`echo $PACKAGE_RELEASE | sed -e "s/\./\_/g" -e "s/@/#/g"`
+ # Remove #kernel.version_release from TAGVER because tagging sources
+ # could occur with different kernel-headers than kernel-headers used at build time.
+ TAGVER=$(echo "$TAGVER" | sed -e 's/#.*//g')
+ echo -n "$TAGVER"
}
tag_files()
set -v;
fi
- if [ -n "$1$2$3$4$5$6$7$8$9${10}" ]; then
- echo "Version: $PACKAGE_VERSION"
- echo "Release: $PACKAGE_RELEASE"
+ echo "Version: $PACKAGE_VERSION"
+ echo "Release: $PACKAGE_RELEASE"
- TAGVER=`make_tagver`
+ TAGVER=`make_tagver`
- if [ "$TAG_VERSION" = "yes" ]; then
- echo "CVS tag: $TAGVER"
- fi
- if [ -n "$TAG" ]; then
- echo "CVS tag: $TAG"
- fi
+ if [ "$TAG_VERSION" = "yes" ]; then
+ echo "CVS tag: $TAGVER"
+ fi
+ if [ -n "$TAG" ]; then
+ echo "CVS tag: $TAG"
+ fi
- OPTIONS="tag -F"
- if [ -n "$CVSROOT" ]; then
- OPTIONS="-d $CVSROOT $OPTIONS"
- fi
+ local OPTIONS="tag $CVS_FORCE"
+ if [ -n "$CVSROOT" ]; then
+ OPTIONS="-d $CVSROOT $OPTIONS"
+ fi
- cd "$SOURCE_DIR"
- for i in $TAG_FILES
- do
- # don't tag files stored on distfiles
- [ -n "`src_md5 $i`" ] && continue
- if [ -f "`nourl $i`" ]; then
- if [ "$TAG_VERSION" = "yes" ]; then
- cvs $OPTIONS $TAGVER `nourl $i`
- fi
- if [ -n "$TAG" ]; then
- cvs $OPTIONS $TAG `nourl $i`
- fi
- else
- Exit_error err_no_source_in_repo $i
- fi
- done
+ cd "$SOURCE_DIR"
+ local tag_files
+ for i in $TAG_FILES; do
+ # don't tag files stored on distfiles
+ [ -n "`src_md5 $i`" ] && continue
+ local fp=`nourl "$i"`
+ if [ -f "$fp" ]; then
+ tag_files="$tag_files $fp"
+ else
+ Exit_error err_no_source_in_repo $i
+ fi
+ done
- cd "$SPECS_DIR"
+ if [ "$tag_files" ]; then
if [ "$TAG_VERSION" = "yes" ]; then
- cvs $OPTIONS $TAGVER $SPECFILE
+ update_shell_title "tag sources: $TAGVER"
+ cvs $OPTIONS $TAGVER $tag_files
fi
if [ -n "$TAG" ]; then
- cvs $OPTIONS $TAG $SPECFILE
+ update_shell_title "tag sources: $TAG"
+ cvs $OPTIONS $TAG $tag_files
fi
+ fi
- unset OPTIONS
+ cd "$SPECS_DIR"
+ if [ "$TAG_VERSION" = "yes" ]; then
+ update_shell_title "tag spec: $TAGVER"
+ cvs $OPTIONS $TAGVER $SPECFILE
+ fi
+ if [ -n "$TAG" ]; then
+ update_shell_title "tag spec: $TAG"
+ cvs $OPTIONS $TAG $SPECFILE
fi
}
set -v;
fi
- if [ -n "$1$2$3$4$5$6$7$8$9${10}" ]; then
-
- OPTIONS="tag -b"
- if [ -n "$CVSROOT" ]; then
- OPTIONS="-d $CVSROOT $OPTIONS"
+ local OPTIONS="tag $CVS_FORCE -b"
+ if [ -n "$CVSROOT" ]; then
+ OPTIONS="-d $CVSROOT $OPTIONS"
+ fi
+ cd "$SOURCE_DIR"
+ local tag_files
+ for i in $TAG_FILES; do
+ local fp=`nourl "$i"`
+ if [ -f "$fp" ]; then
+ tag_files="$tag_files $fp"
+ else
+ Exit_error err_no_source_in_repo $i
fi
- cd "$SOURCE_DIR"
- for i in $TAG_FILES
- do
- if [ -f `nourl $i` ]; then
- cvs $OPTIONS $TAG `nourl $i`
- else
- Exit_error err_no_source_in_repo $i
- fi
- done
- cd "$SPECS_DIR"
- cvs $OPTIONS $TAG $SPECFILE
-
- unset OPTIONS
+ done
+ if [ "$tag_files" ]; then
+ cvs $OPTIONS $TAG $tag_files
fi
+
+ cd "$SPECS_DIR"
+ cvs $OPTIONS $TAG $SPECFILE
}
cd "$SPECS_DIR"
if [ -n "$TRY_UPGRADE" ]; then
- update_shell_title "build_package: try_upgrade"
+ update_shell_title "build_package: try_upgrade"
if [ -n "$FLOAT_VERSION" ]; then
TNOTIFY=`./pldnotify.awk $SPECFILE -n` || exit 1
else
if [ -n "$TNEWVER" ]; then
TOLDVER=`echo $TNOTIFY | awk '{ print $3; }'`
echo "New version found, updating spec file to version " $TNEWVER
- cp -f $SPECFILE $SPECFILE.bak
+ if [ "$REVERT_BROKEN_UPGRADE" = "yes" ]; then
+ cp -f $SPECFILE $SPECFILE.bak
+ fi
chmod +w $SPECFILE
eval "perl -pi -e 's/Version:\t"$TOLDVER"/Version:\t"$TNEWVER"/gs' $SPECFILE"
eval "perl -pi -e 's/Release:\t[1-9]{0,4}/Release:\t0.1/' $SPECFILE"
parse_spec;
- NODIST="yes" UPDATE5="yes" get_files $SOURCES $PATCHES;
+ NODIST="yes" get_files $SOURCES $PATCHES;
+ UPDATE5="yes" update_md5 $SOURCES
+
unset TOLDVER TNEWVER TNOTIFY
fi
fi
if [ "$RETVAL" -ne "0" ]; then
if [ -n "$TRY_UPGRADE" ]; then
echo "\n!!! Package with new version cannot be built automagically\n"
- mv -f $SPECFILE.bak $SPECFILE
+ if [ "$REVERT_BROKEN_UPGRADE" = "yes" ]; then
+ mv -f $SPECFILE.bak $SPECFILE
+ fi
fi
Exit_error err_build_fail;
fi
# use only flags which are in this package.
if [[ $bcond_avail = *${opt}* ]]; then
if [[ $flag = -* ]]; then
- BCOND="$BCOND --without $opt"
+ if [[ $BCOND != *--with?${opt}* ]]; then
+ BCOND="$BCOND --without $opt"
+ fi
else
- BCOND="$BCOND --with $opt"
+ if [[ $BCOND != *--without?${opt}* ]]; then
+ BCOND="$BCOND --with $opt"
+ fi
fi
fi
done
spawn_sub_builder()
{
- package_name="${1}"
- update_shell_title "spawn_sub_builder $package_name"
-
- sub_builder_opts=''
- if [ "${FETCH_BUILD_REQUIRES}" == "yes" ]; then
- sub_builder_opts="${sub_builder_opts} -R"
- fi
- if [ "${REMOVE_BUILD_REQUIRES}" == "nice" ]; then
- sub_builder_opts="${sub_builder_opts} -RB"
- elif [ "${REMOVE_BUILD_REQUIRES}" == "force" ]; then
- sub_builder_opts="${sub_builder_opts} -FRB"
- fi
- if [ "${UPDATE_POLDEK_INDEXES}" == "yes" ]; then
- sub_builder_opts="${sub_builder_opts} -Upi"
- fi
-
- cd "${SPECS_DIR}"
- ./builder ${sub_builder_opts} "$@"
+ package_name="${1}"
+ update_shell_title "spawn_sub_builder $package_name"
+
+ sub_builder_opts=''
+ if [ "${FETCH_BUILD_REQUIRES}" == "yes" ]; then
+ sub_builder_opts="${sub_builder_opts} -R"
+ fi
+ if [ "${REMOVE_BUILD_REQUIRES}" == "nice" ]; then
+ sub_builder_opts="${sub_builder_opts} -RB"
+ elif [ "${REMOVE_BUILD_REQUIRES}" == "force" ]; then
+ sub_builder_opts="${sub_builder_opts} -FRB"
+ fi
+ if [ "${UPDATE_POLDEK_INDEXES}" == "yes" ]; then
+ sub_builder_opts="${sub_builder_opts} -Upi"
+ fi
+
+ cd "${SPECS_DIR}"
+ ./builder ${sub_builder_opts} "$@"
}
remove_build_requires()
display_branches()
{
- if [ "$NOCVSSPEC" != "yes" ]; then
- echo -ne "Available branches: "
- cvs status -v "${SPECFILE}" | awk '!/Sticky Tag:/ && /\(branch:/ { print $1 } ' | xargs
- fi
+ if [ "$NOCVSSPEC" != "yes" ]; then
+ echo -ne "Available branches: "
+ cvs status -v "${SPECFILE}" | awk '!/Sticky Tag:/ && /\(branch:/ { print $1 } ' | xargs
+ fi
}
# checks a given list of packages/files/provides agains current rpmdb.
# input can be either STDIN or parameters
_rpm_prov_check()
{
- local DEPS
+ local DEPS
- if [ "$#" -gt 0 ]; then
- DEPS="$@"
- else
- DEPS=$(cat)
- fi
+ if [ "$#" -gt 0 ]; then
+ DEPS="$@"
+ else
+ DEPS=$(cat)
+ fi
- DEPS=$(rpm -q --whatprovides $DEPS 2>&1 | awk '/^(error:|no package provides)/ { print }')
+ DEPS=$(rpm -q --whatprovides $DEPS 2>&1 | awk '/^(error:|no package provides)/ { print }')
- # packages
- echo "$DEPS" | awk '/^no package provides/ { print $NF }'
+ # packages
+ echo "$DEPS" | awk '/^no package provides/ { print $NF }'
- # other deps (files)
- echo "$DEPS" | awk -F: '/^error:.*No such file/{o = $2; gsub("^ file ", "", o); print o}'
+ # other deps (files)
+ echo "$DEPS" | awk -F: '/^error:.*No such file/{o = $2; gsub("^ file ", "", o); print o}'
}
# checks if given package/files/provides exists in rpmdb.
# returns packages wchi hare present in the rpmdb
_rpm_cnfl_check()
{
- local DEPS
+ local DEPS
- if [ "$#" -gt 0 ]; then
- DEPS="$@"
- else
- DEPS=$(cat)
- fi
+ if [ "$#" -gt 0 ]; then
+ DEPS="$@"
+ else
+ DEPS=$(cat)
+ fi
- rpm -q --whatprovides $DEPS 2>/dev/null | awk '!/no package provides/ { print }'
+ rpm -q --whatprovides $DEPS 2>/dev/null | awk '!/no package provides/ { print }'
}
fetch_build_requires()
$SU_SUDO /usr/bin/poldek --noask --nofollow -ev $CONF
fi
- while [ "$DEPS" ]; do
+ while [ "$DEPS" ]; do
update_shell_title "install deps: $DEPS"
echo "Trying to install dependencies ($DEPS):"
local log=.${SPECFILE}_poldek.log
rm -f $log
local ok
if [ -n "$failed" ]; then
- for package in $failed; do
- # FIXME: sanitise, deps could be not .spec files
- spawn_sub_builder -bb $package && ok="$ok $package"
- done
- DEPS="$ok"
+ for package in $failed; do
+ # FIXME: sanitise, deps could be not .spec files
+ spawn_sub_builder -bb $package && ok="$ok $package"
+ done
+ DEPS="$ok"
else
- DEPS=""
+ DEPS=""
fi
- done
+ done
return
fi
init_builder
echo "To checkout *all* .spec files:"
- echo "- remove $SPECS_DIR/CVS/Entries.Static"
- echo "- run cvs up in $SPECS_DIR dir"
+ echo "- remove $SPECS_DIR/CVS/Entries.Static"
+ echo "- run cvs up in $SPECS_DIR dir"
echo ""
echo "To commit with your developer account:"
- echo "- edit $SPECS_DIR/CVS/Root"
- echo "- edit $SOURCE_DIR/CVS/Root"
+ echo "- edit $SPECS_DIR/CVS/Root"
+ echo "- edit $SOURCE_DIR/CVS/Root"
}
#---------------------------------------------
do
case "${1}" in
-5 | --update-md5 )
- COMMAND="get";
+ COMMAND="update_md5";
NODIST="yes"
NOCVSSPEC="yes"
UPDATE5="yes"
shift ;;
-a5 | --add-md5 )
- COMMAND="get";
+ COMMAND="update_md5";
NODIST="yes"
NOCVS="yes"
NOCVSSPEC="yes"
COMMAND="branch"; shift; TAG="${1}"; shift;;
-c | --clean )
CLEAN="--clean --rmspec --rmsource"; shift ;;
+ -cf | --cvs-force )
+ CVS_FORCE="-F"; shift;;
-d | --cvsroot )
shift; CVSROOT="${1}"; shift ;;
-g | --get )
done;;
"no")
if [[ "$2" = *,* ]]; then
- for a in $(echo "$2" | tr , ' '); do
- BCOND="$BCOND $1 $a"
- done
+ for a in $(echo "$2" | tr , ' '); do
+ BCOND="$BCOND $1 $a"
+ done
else
- BCOND="$BCOND $1 $2"
+ BCOND="$BCOND $1 $2"
fi
shift 2 ;;
esac
TAG="STABLE"
TAG_VERSION="yes"
shift;;
- -Tvn | --tag-version-nest )
- COMMAND="tag";
- TAG="NEST"
- TAG_VERSION="yes"
- shift;;
-Ts | --tag-stable )
COMMAND="tag";
TAG="STABLE"
TAG_VERSION="no"
shift;;
- -Tn | --tag-nest )
- COMMAND="tag";
- TAG="NEST"
- TAG_VERSION="no"
- shift;;
-Tv | --tag-version )
COMMAND="tag";
TAG=""
INTEGER_RELEASE="yes"
shift;;
-U | --update )
- COMMAND="get"
+ COMMAND="update_md5"
UPDATE="yes"
NOCVSSPEC="yes"
NODIST="yes"
--define)
shift
MACRO="${1}"
- VALUE="${2}"
- shift 2
- RPMOPTS="${RPMOPTS} --define \"${MACRO} ${VALUE}\""
+ shift
+ if echo "${MACRO}" | grep -q '\W'; then
+ RPMOPTS="${RPMOPTS} --define \"${MACRO}\""
+ else
+ VALUE="${1}"
+ shift
+ RPMOPTS="${RPMOPTS} --define \"${MACRO} ${VALUE}\""
+ fi
;;
--show-bconds | -show-bconds | -print-bconds | --print-bconds | -display-bconds | --display-bconds )
SHOW_BCONDS="yes"
CVSTAG="${SPECFILE##*:}";
SPECFILE="${SPECFILE%%:*}";
fi
- shift ;;
+ shift
esac
done
+if [ -z "$CVSTAG" ]; then
+ CVSTAG=$(awk -vSPECFILE="${SPECFILE%.spec}.spec" -F/ '$2 == SPECFILE && $6 ~ /^T/{print substr($6, 2)}' CVS/Entries)
+ if [ "$CVSTAG" ]; then
+ echo "builder: Stick tag $CVSTAG active. Use -r TAGNAME to override."
+ fi
+elif [ "$CVSTAG" = "HEAD" ]; then
+ # assume -r HEAD is same as -A
+ CVSTAG=""
+fi
+
if [ -n "$DEBUG" ]; then
set -x;
set -v;
# - do not allow to build from HEAD when XX-branch exists
TREE_PREFIX=$(echo "$TAG_PREFIX" | sed -e 's#^auto-\([a-zA-Z]\+\)-.*#\1#g')
if [ "$TREE_PREFIX" != "$TAG_PREFIX" ]; then
- TAG_BRANCH="${TREE_PREFIX}-branch"
- TAG_STATUS=$(cvs status -v $SPECFILE | grep -Ei "${TAG_BRANCH}.+(branch: [0-9.]+)")
- if [ -n "$TAG_STATUS" -a "$CVSTAG" = "HEAD" ]; then
- Exit_error err_branch_exists "$TAG_STATUS"
- fi
-
+ TAG_BRANCH="${TREE_PREFIX}-branch"
+ TAG_STATUS=$(cvs status -v $SPECFILE | grep -Ei "${TAG_BRANCH}.+(branch: [0-9.]+)")
+ if [ -n "$TAG_STATUS" -a "$CVSTAG" = "HEAD" ]; then
+ Exit_error err_branch_exists "$TAG_STATUS"
+ fi
fi
fi
if [ -n "$NOSOURCE0" ] ; then
SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
fi
- get_files $SOURCES $PATCHES;
+ get_files $SOURCES $PATCHES
+ check_md5 $SOURCES
build_package;
if [ "$UPDATE_POLDEK_INDEXES" = "yes" -a "$COMMAND" != "build-prep" ]; then
run_poldek --sdir="${POLDEK_INDEX_DIR}" --mkidxz
if [ -n "$SPECFILE" ]; then
get_spec;
parse_spec;
- get_files $SOURCES $PATCHES;
- branch_files $TAG "$SOURCES $PATCHES $ICONS";
+ # don't fetch sources from remote locations
+ new_SOURCES=""
+ for file in $SOURCES; do
+ [ -n "`src_md5 $file`" ] && continue
+ new_SOURCES="$new_SOURCES $file"
+ done
+ SOURCES="$new_SOURCES"
+ get_files $SOURCES $PATCHES
+ check_md5 $SOURCES
+ branch_files $TAG $SOURCES $PATCHES $ICONS
else
Exit_error err_no_spec_in_cmdl;
fi
SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
fi
get_files $SOURCES $PATCHES
+ check_md5 $SOURCES
+ else
+ Exit_error err_no_spec_in_cmdl;
+ fi
+ ;;
+ "update_md5" )
+ init_builder;
+ if [ -n "$SPECFILE" ]; then
+ get_spec;
+ parse_spec
+
+ if [ -n "$NOSOURCE0" ] ; then
+ SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
+ fi
+ update_md5 $SOURCES
else
Exit_error err_no_spec_in_cmdl;
fi
# don't fetch sources from remote locations
new_SOURCES=""
- for file in $SOURCES
- do
+ for file in $SOURCES; do
[ -n "`src_md5 $file`" ] && continue
new_SOURCES="$new_SOURCES $file"
done
SOURCES="$new_SOURCES"
- get_files $SOURCES $PATCHES;
- tag_files "$SOURCES $PATCHES $ICONS";
+ get_files $SOURCES $PATCHES
+ check_md5 $SOURCES
+ tag_files $SOURCES $PATCHES $ICONS
else
Exit_error err_no_spec_in_cmdl;
fi
DONT_PRINT_REVISION="yes"
get_spec
parse_spec
- SAPS="$SOURCES $PATCHES"
- for SAP in $SAPS ; do
- echo $SAP | awk '{gsub(/.*\//,"") ; print}'
+ for SAP in $SOURCES $PATCHES; do
+ echo $SAP | awk '{gsub(/.*\//,"") ; print}'
done
;;
"list-sources-urls" )
parse_spec
SAPS="$SOURCES $PATCHES"
for SAP in $SAPS ; do
- echo $SAP
+ echo $SAP
done
;;
"list-sources-local-paths" )
DONT_PRINT_REVISION="yes"
get_spec
parse_spec
- SAPS="$SOURCES $PATCHES"
- for SAP in $SAPS ; do
- echo $SOURCE_DIR/$(echo $SAP | awk '{gsub(/.*\//,"") ; print }')
+ for SAP in $SOURCES $PATCHES; do
+ echo $SOURCE_DIR/$(echo $SAP | awk '{gsub(/.*\//,"") ; print }')
done
;;
"list-sources-distfiles-paths" )
DONT_PRINT_REVISION="yes"
get_spec
parse_spec
- SAPS="$SOURCES $PATCHES"
- for SAP in $SAPS ; do
+ for SAP in $SOURCES $PATCHES; do
if [ -n "$(src_md5 "$SAP")" ]; then
distfiles_path "$SAP"
fi
DONT_PRINT_REVISION="yes"
get_spec
parse_spec
- SAPS="$SOURCES $PATCHES"
- for SAP in $SAPS ; do
+ for SAP in $SOURCES $PATCHES; do
if [ -n "$(src_md5 "$SAP")" ]; then
distfiles_url "$SAP"
fi
fi
cd "$__PWD"
-# vi:syntax=sh:ts=4:sw=4
+# vi:syntax=sh:ts=4:sw=4:noet