VERSION="v0.35"
VERSIONSTRING="\
Build package utility from PLD Linux Packages repository
-$VERSION (C) 1999-2016 Free Penguins".
+$VERSION (C) 1999-2020 Free Penguins".
-CLEAN_PATH="/bin:/usr/bin:/usr/sbin:/sbin:/usr/X11R6/bin"
+# Clean PATH without /usr/local or user paths
+CLEAN_PATH="/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin"
# required rpm-build-macros
RPM_MACROS_VER=1.534
PACKAGE_NAME=""
ASSUMED_NAME=""
PROTOCOL="http"
+IPOPT=""
# use lftp by default when available
-USE_LFTP=
-lftp --version > /dev/null 2>&1 && USE_LFTP=yes
+test -z "${USE_LFTP+x}" && lftp --version > /dev/null 2>&1 && USE_LFTP=yes
PARALLEL_DOWNLOADS=10
WGET_RETRIES=${MAX_WGET_RETRIES:-0}
fi
if [ -n "$USE_PROZILLA" ]; then
- GETURI="proz --no-getch -r -P ./ -t$WGET_RETRIES $PROZILLA_OPTS"
- GETURI2="$GETURI"
- OUTFILEOPT="-O"
+ GETURI=download_proz
elif [ -n "$USE_AXEL" ]; then
- GETURI="axel -a $AXEL_OPTS"
- GETURI2="$GETURI"
- OUTFILEOPT="-o"
+ GETURI=download_axel
elif [ -n "$USE_LFTP" ]; then
GETURI=download_lftp
- GETURI2=$GETURI
- OUTFILEOPT=""
else
- 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"
- wget --help 2>&1 | grep -q -- ' --no-iri ' && WGET_OPTS="$WGET_OPTS --no-iri"
- WGET_OPTS="$WGET_OPTS --user-agent=$USER_AGENT"
-
- GETURI="wget --passive-ftp -c -nd -t$WGET_RETRIES $WGET_OPTS"
- GETURI2="wget -c -nd -t$WGET_RETRIES $WGET_OPTS"
- OUTFILEOPT="-O"
+ GETURI=download_wget
fi
-GETLOCAL="cp -a"
+GETLOCAL=${GETLOCAL:-cp -a}
-if rpm --version 2>&1 | grep -q '4.0.[0-2]'; then
- RPM="rpm"
- RPMBUILD="rpm"
-else
- RPM="rpm"
- RPMBUILD="rpmbuild"
-fi
+RPM="rpm"
+RPMBUILD="rpmbuild"
#
# sanity checks
#---------------------------------------------
# functions
+download_prozilla() {
+ local outfile=$1 url=$2 retval
+
+ proz --no-getch -r -P ./ -t$WGET_RETRIES $PROZILLA_OPTS -O "$outfile" "$url"
+ retval=$?
+
+ return $retval
+}
+
+download_axel() {
+ local outfile=$1 url=$2 retval
+
+ axel -a $AXEL_OPTS -o "$outfile" "$url"
+ retval=$?
+
+ return $retval
+}
+
+download_wget() {
+ local outfile=$1 url=$2 retval wget_help
+ if [ -z "${WGET_OPTS_SET+x}" ]; then
+ wget_help="$(wget --help 2>&1)"
+ echo "$wget_help" | grep -q -- ' --inet ' && WGET_OPTS="$WGET_OPTS --inet"
+ echo "$wget_help" | grep -q -- ' --retry-connrefused ' && WGET_OPTS="$WGET_OPTS --retry-connrefused"
+ echo "$wget_help" | grep -q -- ' --no-iri ' && WGET_OPTS="$WGET_OPTS --no-iri"
+ WGET_OPTS="-c -nd -t$WGET_RETRIES $WGET_OPTS --user-agent=$USER_AGENT $IPOPT --passive-ftp"
+ WGET_OPTS_SET=1
+ fi
+
+ wget $WGET_OPTS -O "$outfile" "$url"
+ retval=$?
+ if [ $retval -ne 0 ]; then
+ if [ "`echo $url | grep -E 'ftp://'`" ]; then
+ ${GETURI} -O "$outfile" "$url"
+ retval=$?
+ fi
+ fi
+ return $retval
+}
+
download_lftp() {
local outfile=$1 url=$2 retval tmpfile
- # TODO: use mktemp
- tmpfile=$outfile.tmp
+ tmpfile=$(tempfile) || exit 1
lftp -c "
$([ "$DEBUG" = "yes" ] && echo "debug 5;")
+ $([ "$IPOPT" = "-4" ] && echo "set dns:order \"inet\";")
+ $([ "$IPOPT" = "-6" ] && echo "set dns:order \"inet6\";")
set ssl:verify-certificate no;
set net:max-retries $WGET_RETRIES;
set http:user-agent \"$USER_AGENT\";
"
}
+is_rpmorg() {
+ local v
+
+ v=$(LC_ALL=C LANG=C rpm --version 2>&1)
+ v=${v#RPM version } # rpm 4
+ v=${v#rpm \(RPM\) } # rpm 5
+
+ case "$v" in
+ 4.5|5.*)
+ return 1
+ ;;
+ 4.*)
+ return 0;
+ ;;
+ *)
+ echo "ERROR: unsupported RPM version $v" >&2
+ exit 1
+ esac
+}
+
# create tempfile. as secure as possible
tempfile() {
local prefix=builder.$PACKAGE_NAME${1:+.$1}
done > $gitlog
# add link to full git logs
- local giturl="http://git.pld-linux.org/?p=packages/$PACKAGE_NAME.git;a=log"
+ local giturl="http://git.pld-linux.org/?p=packages/${SPECFILE%.spec}.git;a=log"
if [ -n "$CVSTAG" ]; then
giturl="$giturl;h=$CVSTAG"
fi
# runs rpm with minimal macroset
minirpm() {
- safe_macrofiles=$(rpm $TARGET_SWITCH --showrc | awk -F: '/^macrofiles/ { gsub(/^macrofiles[ \t]+:/, "", $0); print $0 } ')
-
# TODO: move these to /usr/lib/rpm/macros
cat > $BUILDER_MACROS <<'EOF'
%x8664 x86_64 amd64 ia32e
%_sourcedir ./
EOF
fi
- eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --macros "$safe_macrofiles:$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1
+ if ! is_rpmorg; then
+ local safe_macrofiles
+ safe_macrofiles=$(rpm $TARGET_SWITCH --showrc | awk -F: '/^macrofiles/ { gsub(/^macrofiles[ \t]+:/, "", $0); print $0 } ')
+ eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --macros "$safe_macrofiles:$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1
+ else
+ eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --load "$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1
+ fi
}
cache_rpm_dump() {
exit 2 ;;
"err_no_spec_in_repo" )
remove_build_requires
- echo >&2 "Error: spec file not stored in PLD repo."
+ echo >&2 "Error: spec file not stored in repository."
+ if [ -n "$2" ]; then
+ echo >&2 "Tried: $2"
+ fi
+
exit 3 ;;
"err_no_source_in_repo" )
remove_build_requires
if [ "$NOCVSSPEC" != "yes" ]; then
if [ -z "$DEPTH" ]; then
if [ -d "$PACKAGE_DIR/.git" ]; then
- git fetch $REMOTE_PLD || Exit_error err_no_spec_in_repo
+ git fetch $IPOPT $REMOTE_PLD || Exit_error err_no_spec_in_repo
elif [ "$ADD_PACKAGE_CVS" = "yes" ]; then
if [ ! -r "$PACKAGE_DIR/$SPECFILE" ]; then
echo "ERROR: No package to add ($PACKAGE_DIR/$SPECFILE)" >&2
else
(
unset GIT_WORK_TREE
- git clone -o $REMOTE_PLD ${GIT_SERVER}/${PACKAGES_DIR}/${ASSUMED_NAME}.git || {
+ git clone $IPOPT -o $REMOTE_PLD ${GIT_SERVER}/${PACKAGES_DIR}/${ASSUMED_NAME}.git || {
# softfail if new package, i.e not yet added to PLD rep
[ ! -f "$PACKAGE_DIR/$SPECFILE" ] && Exit_error err_no_spec_in_repo
- echo "Warning: package not in CVS - assuming new package"
+ echo "Warning: package not in Git - assuming new package"
NOCVSSPEC="yes"
}
git config --local --add "remote.$REMOTE_PLD.fetch" 'refs/notes/*:refs/notes/*'
if [ -z "$ALL_BRANCHES" ]; then
refs="${CVSTAG}:remotes/${REMOTE_PLD}/${CVSTAG}"
fi
- git fetch $DEPTH $REMOTE_PLD $refs || {
+ git fetch $IPOPT $DEPTH $REMOTE_PLD $refs || {
echo >&2 "Error: branch $CVSTAG does not exist"
exit 3
}
fi
- git fetch $REMOTE_PLD 'refs/notes/*:refs/notes/*'
+ git fetch $IPOPT $REMOTE_PLD 'refs/notes/*:refs/notes/*'
cvsignore_df .gitignore
# create symlinks for tools
if [ "$SYMLINK_TOOLS" != "no" -a -d "$PACKAGE_DIR" ]; then
- for a in dropin md5 adapter builder {relup,compile,repackage,rsync,pearize}.sh; do
+ for a in dropin md5 builder {relup,compile,repackage,rsync,pearize}.sh; do
# skip tools that don't exist in top dir
[ -f $a ] || continue
# skip tools that already exist
fi
if [ -n "$CVSTAG" ]; then
- if git rev-parse --verify -q "$CVSTAG"; then
- git checkout "$CVSTAG" --
+ if git rev-parse --verify -q "$CVSTAG" >/dev/null; then
+ # checkout only if differs, so this will not trash git reflog
+ if [ $(git rev-parse "$CVSTAG") != $(git rev-parse HEAD) ]; then
+ git checkout "$CVSTAG" --
+ fi
elif git rev-parse --verify -q "refs/remotes/${REMOTE_PLD}/$CVSTAG"; then
git checkout -t "refs/remotes/${REMOTE_PLD}/$CVSTAG" > /dev/null
fi
if [ $(git rev-parse "$CVSTAG") != $(git rev-parse HEAD) ]; then
Exit_error "err_no_checkut" "$CVSTAG"
fi
- git merge --ff-only '@{u}'
+
+ git merge --ff-only '@{u}'
git symbolic-ref -q HEAD > /dev/null && [ "$NOCVSSPEC" != "yes" ] &&
if [ -n "$CVSDATE" ]; then
git checkout $(git rev-list -n1 --before="'$CVSDATE'" $CVSTAG) || exit 1
fi
if [ ! -f "$PACKAGE_DIR/$SPECFILE" ]; then
- Exit_error err_no_spec_in_repo
+ Exit_error err_no_spec_in_repo "$PACKAGE_DIR/$SPECFILE"
fi
if [ "$CHMOD" = "yes" -a -n "$SPECFILE" ]; then
uri="df: $uri"
fi
update_shell_title "${GETURI%% *}: $uri"
- ${GETURI} ${OUTFILEOPT} "$target" "$url" || \
- if [ "`echo $url | grep -E 'ftp://'`" ]; then
- update_shell_title "${GETURI2%% *}: $url"
- ${GETURI2} ${OUTFILEOPT} "$target" "$url"
- fi
+ ${GETURI} "$target" "$url"
fi
# is it empty file?
${GETLOCAL} $url_attic $target
else
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"
- ${GETURI2} ${OUTFILEOPT} "$target" "$url_attic"
- fi
+ ${GETURI} "$target" "$url_attic"
test -s "$target" || rm -f "$target"
fi
fi
im="$i"
fi
update_shell_title "${GETURI%% *}: $im"
- ${GETURI} ${OUTFILEOPT} "$target" "$im" || \
- if [ "`echo $im | grep -E 'ftp://'`" ]; then
- update_shell_title "${GETURI2%% *}: $im"
- ${GETURI2} ${OUTFILEOPT} "$target" "$im"
- fi
+ ${GETURI} "$target" "$im"
test -s "$target" || rm -f "$target"
fi
FROM_DISTFILES=2
rm -f $target
update_shell_title "${GETURI%% *}: $url"
- ${GETURI} ${OUTFILEOPT} "$target" "$url" || \
- if [ "`echo $url | grep -E 'ftp://'`" ]; then
- update_shell_title "${GETURI2%% *}: $url"
- ${GETURI2} ${OUTFILEOPT} "$target" "$url"
- fi
+ ${GETURI} "$target" "$url"
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"
- ${GETURI2} ${OUTFILEOPT} "$target" "$url_attic"
- fi
+ ${GETURI} "$target" "$url_attic"
fi
test -s "$target" || rm -f "$target"
fi
if tag_exist $_tag || [ -n "$CVS_FORCE" ]; then
update_shell_title "tag sources: $_tag"
git $OPTIONS $_tag || exit
- git push $CVS_FORCE $REMOTE_PLD tag $_tag || Exit_error err_remote_problem $REMOTE_PLD
+ git push $IPOPT $CVS_FORCE $REMOTE_PLD tag $_tag || Exit_error err_remote_problem $REMOTE_PLD
else
echo "Tag $_tag already exists and points to the same commit"
fi
unset GIT_WORK_TREE GIT_DIR
# these are set by jenkins
unset GIT_PREVIOUS_COMMIT GIT_URL GIT_PREVIOUS_SUCCESSFUL_COMMIT GIT_BRANCH GIT_COMMIT
+ # this may be set by user
+ unset GIT_SSH
+ # may be set by user
+ unset GIT_COMMITTER_NAME GIT_COMMITTER_EMAIL GIT_AUTHOR_NAME GIT_AUTHOR_EMAIL GIT_TESTING_PORCELAIN_COMMAND_LIST GIT_EDITOR
# fail if something still set
- env | grep ^GIT_ && Exit_error err_build_fail
+ env | grep ^GIT_ && Exit_error err_build_fail "One of GIT_* env variables is still set. The builder script needs to be updated to unset that variable. In the meantime, unset it manually."
local specdir=$(insert_gitlog $SPECFILE)
+ ulimit -c unlimited
# FIXME: eval here is exactly why?
PATH=$CLEAN_PATH eval teeboth "'$logfile'" ${TIME_COMMAND} ${NICE_COMMAND} $RPMBUILD $TARGET_SWITCH $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $RPMBUILDOPTS $BCOND --define \'_specdir $PACKAGE_DIR\' --define \'_sourcedir $PACKAGE_DIR\' $specdir/$SPECFILE
retval=$?
without_*)
bcond=${opt#without_}
case "$BCOND" in
- *--without?${bcond}*)
+ *--without?${bcond}\ *|*--without?${bcond})
AVAIL_BCONDS_WITHOUT="$AVAIL_BCONDS_WITHOUT <$bcond>"
;;
*)
with_*)
bcond=${opt#with_}
case "$BCOND" in
- *--with?${bcond}*)
+ *--with?${bcond}\ *|*--with?${bcond})
AVAIL_BCONDS_WITH="$AVAIL_BCONDS_WITH <$bcond>"
;;
*)
# @return exit code from poldek
#
# this requires following sudo rules:
-# - poldek --noask --caplookup -uG
+# - poldek --noask --caplookup -ug
poldek_install() {
- LANG=C $POLDEK_CMD --noask --caplookup --uniq -uG "$@"
+ LC_ALL=C LANG=C $POLDEK_CMD --noask --caplookup --uniq -ug "$@"
}
# install packages
# sync poldek indexes once per invocation
if [ -z "$package_indexes_updated" ]; then
update_shell_title "poldek: update indexes"
- $POLDEK_CMD -q --update --upa
+ $POLDEK_CMD -q --update --upa --mo=nodesc
package_indexes_updated=true
fi
DEPS=$(cat)
fi
- LANG=C rpm -q --whatprovides $DEPS 2>/dev/null | awk '!/no package provides/ { print }'
+ LC_ALL=C LANG=C rpm -q --whatprovides $DEPS 2>/dev/null | awk '!/no package provides/ { print }'
}
# install deps via information from 'rpm-getdeps' or 'rpm --specsrpm'
local localrepo=$2
if [ ! -e $localrepo ]; then
- git clone -o $REMOTE_PLD ${GIT_SERVER}/$remoterepo $localrepo
+ git clone $IPOPT -o $REMOTE_PLD ${GIT_SERVER}/$remoterepo $localrepo
git --git-dir=$localrepo/.git remote set-url --push $REMOTE_PLD ssh://${GIT_PUSH}/$remoterepo
fi
}
cd "$TOP_DIR"
init_repository ${PACKAGES_DIR}/rpm-build-tools.git ../rpm-build-tools
init_repository projects/$TEMPLATES ../$TEMPLATES
- for a in adapter builder fetchsrc_request compile repackage; do
+ for a in builder fetchsrc_request compile repackage; do
ln -sf ../rpm-build-tools/${a}.sh $a
done
for a in md5; do
while [ $# -gt 0 ]; do
case "${1}" in
-4|-6)
- # NOTE: we should be fetcher specific, like fille WGET_OPTS, but
- # unfortunately $GETURI is already formed
- GETURI="$GETURI $1"
+ IPOPT="${1}"
shift
;;
-5 | --update-md5)
--http )
PROTOCOL="http"; shift ;;
-j)
- RPMOPTS="${RPMOPTS} --define \"_smp_mflags -j$2\""
+ RPMOPTS="${RPMOPTS} --define \"__jobs $2\""
shift 2
;;
-j[0-9]*)
- RPMOPTS="${RPMOPTS} --define \"_smp_mflags $1\""
+ RPMOPTS="${RPMOPTS} --define \"__jobs ${1#-j}\""
shift
;;
-p)
fi
get_files $SOURCES $PATCHES
check_md5 $SOURCES
+ fetch_build_requires
;;
"update_md5" )
init_builder