]> TLD Linux GIT Repositories - packages/rpm-build-tools.git/blobdiff - builder.sh
- fix systemd exclude check regex
[packages/rpm-build-tools.git] / builder.sh
index 14f317ac24cc09de0b90933ba2b54191f2911238..587d275c9ba413f0770529a01c0d846a1c6613c0 100755 (executable)
@@ -97,6 +97,7 @@ LASTLOG_FILE=""
 CHMOD="no"
 CHMOD_MODE="0644"
 RPMOPTS=""
+RPMUSERDEFS=""
 RPMBUILDOPTS=""
 BCOND=""
 GROUP_BCONDS="no"
@@ -122,6 +123,8 @@ WGET_RETRIES=${MAX_WGET_RETRIES:-0}
 
 # rsync repository with git refs of packages
 PKGREVS_URL="http://pkgrevs.tld-linux.org"
+PKGREVS_PREFIX="tld/"
+SETPKGREV="false"
 
 # TLD git/df config
 TLD_GIT_SERVER="git://git.tld-linux.org"
@@ -335,13 +338,11 @@ usage() {
 # if the line contains short and long option, it will take only the long option
 # but if you want both being completed, put the short option to separate line
        echo "\
-Usage: builder [--all-branches] [-D|--debug] [-V|--version] [--short-version]  [-a|--add_cvs] [-b|-ba|--build]
-[-bb|--build-binary] [-bs|--build-source] [-bc] [-bi] [-bl] [-u|--try-upgrade]
-[{-cf|--cvs-force}] [{-B|--branch} <branch>] [--depth <number>]
-[-g|--get] [-h|--help] [--ftp] [--http] [{-l|--logtofile} <logfile>] [-m|--mr-proper]
-[-q|--quiet] [--date <yyyy-mm-dd> [-r <tag>] [{-T|--tag <tag>]
-[-Tvs|--tag-version-stable] [-Ts|--tag-stable] [-Tv|--tag-version]
-[{-Tp|--tag-prefix} <prefix>] [{-tt|--test-tag}]
+Usage: builder [--all-branches] [-D|--debug] [-V|--version] [--short-version]
+[-a|--add_cvs] [-b|-ba|--build] [-bb|--build-binary] [-bs|--build-source]
+[-bc] [-bi] [-bl] [-u|--try-upgrade] [{-cf|--cvs-force}] [{-B|--branch} <branch>]
+[--depth <number>] [-g|--get] [-h|--help] [--ftp] [--http] [{-l|--logtofile} <logfile>]
+[-m|--mr-proper] [-q|--quiet] [--date <yyyy-mm-dd>] [-r <tag>]
 [-nu|--no-urls] [-v|--verbose] [--opts <rpm opts>] [--short-circuit]
 [--show-bconds] [--with/--without <feature>] [--define <macro> <value>]
 [--git-pld|--git-tld] [--pkgrev] [-lp]
@@ -442,18 +443,6 @@ Usage: builder [--all-branches] [-D|--debug] [-V|--version] [--short-version]  [
                       but icon file is absent),
 -su, --source-urls  - list urls - urls to sources and patches
                       intended for copying urls with spec with lots of macros in urls
--T <tag> , --tag <tag>
-                    - add git tag <tag> for files,
--Tvs, --tag-version-stable
-                    - add git tags STABLE and NAME-VERSION-RELEASE for files,
--Ts, --tag-stable
-                    - add git tag STABLE for files,
--Tv,
---tag-version       - add git tag NAME-VERSION-RELEASE for files,
--Tp, --tag-prefix <prefix>
-                    - add <prefix> to NAME-VERSION-RELEASE tags,
--tt, --test-tag <prefix>
-                    - fail if tag is already present,
 -ir, --integer-release-only
                     - allow only integer and snapshot releases
 -v, --verbose       - be verbose,
@@ -733,21 +722,27 @@ EOF
        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
+               eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --macros "$safe_macrofiles:$BUILDER_MACROS" $QUIET $RPMOPTS $RPMUSERDEFS $RPMBUILDOPTS $BCOND $* 2>&1
        else
-               eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --load "$BUILDER_MACROS" $QUIET $RPMOPTS $RPMBUILDOPTS $BCOND $* 2>&1
+               eval PATH=$CLEAN_PATH $RPMBUILD $TARGET_SWITCH --load "$BUILDER_MACROS" $QUIET $RPMOPTS $RPMUSERDEFS $RPMBUILDOPTS $BCOND $* 2>&1
        fi
 }
 
 cache_rpm_dump() {
+       local SPEC_PATH
        if [ -n "$DEBUG" ]; then
                set -x
                set -v
        fi
 
+       if [ ! -z "$1" ]; then
+               SPEC_PATH="$1"
+       else
+               SPEC_PATH="$PACKAGE_DIR/$SPECFILE"
+       fi
        if [ -x /usr/bin/rpm-specdump ]; then
                update_shell_title "cache_rpm_dump using rpm-specdump command"
-               rpm_dump_cache=$(rpm-specdump $TARGET_SWITCH $BCOND --define "_specdir $PACKAGE_DIR" --define "_sourcedir $PACKAGE_DIR" $PACKAGE_DIR/$SPECFILE)
+               rpm_dump_cache=$(eval rpm-specdump $TARGET_SWITCH $BCOND $RPMUSERDEFS --define \'_specdir $PACKAGE_DIR\' --define \'_sourcedir $PACKAGE_DIR\' $SPEC_PATH)
        else
                update_shell_title "cache_rpm_dump using rpmbuild command"
                local rpm_dump
@@ -810,7 +805,7 @@ parse_spec() {
        get_icons
 
        cd $PACKAGE_DIR
-       cache_rpm_dump
+       cache_rpm_dump "$1"
 
        if rpm_dump | grep -qEi ":.*nosource.*1"; then
                FAIL_IF_NO_SOURCES="no"
@@ -896,9 +891,9 @@ Exit_error() {
                        remove_build_requires
                        echo >&2 "Error: couldn't get out package name/version/release from spec file."
                        exit 6 ;;
-               "err_tag_exists" )
+               "err_pkgrev_exists" )
                        remove_build_requires
-                       echo >&2 "Tag ${2} already exists"
+                       echo >&2 "Error: package revision ${2} already exists"
                        exit 9 ;;
                "err_fract_rel" )
                        remove_build_requires
@@ -941,7 +936,7 @@ init_builder() {
        fi
 
        if [ "$NOINIT" != "yes" ] ; then
-               TOP_DIR=$(eval $RPM $RPMOPTS --eval '%{_topdir}')
+               TOP_DIR=$(eval $RPM $RPMOPTS $RPMUSERDEFS --eval '%{_topdir}')
 
                local macros_ver=$(rpm -E %?rpm_build_macros)
                if [ -z "$macros_ver" ]; then
@@ -1468,36 +1463,13 @@ get_files() {
        fi
 }
 
-tag_exist() {
-# If tag exists and points to other commit exit with error
-# If it existsts and points to HEAD return 1
-# If it doesn't exist return 0
-       local _tag="$1"
-       local sha1=$(git rev-parse HEAD)
-       echo "Searching for tag $_tag..."
-       if [ -n "$DEPTH" ]; then
-               local ref=$(git ls-remote $REMOTE_PLD "refs/tags/$_tag"  | cut -c -40)
-       else
-               local ref=$(git show-ref -s "refs/tags/$_tag")
-       fi
-       [ -z "$ref" ] && return 0
-       [ "$ref" = "$sha1" ] || Exit_error err_tag_exists "$_tag"
-       return 1
-}
-
-make_tagver() {
+make_pkgrev() {
        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
-
-       # NOTE: CVS tags may must not contain the characters `$,.:;@'
-       TAGVER=$(echo $TAG_PREFIX$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_RELEASE)
+       TAGVER=$(echo $PKGREVS_PREFIX$PACKAGE_NAME-$PACKAGE_VERSION-$PACKAGE_RELEASE)
 
        # Remove @kernel.version_release from TAGVER because tagging sources
        # could occur with different kernel-headers than kernel-headers used at build time.
@@ -1510,37 +1482,6 @@ make_tagver() {
        echo -n "$TAGVER"
 }
 
-tag_files() {
-       if [ -n "$DEBUG" ]; then
-               set -x
-               set -v
-       fi
-
-       echo "Version: $PACKAGE_VERSION"
-       echo "Release: $PACKAGE_RELEASE"
-
-       local _tag
-       if [ "$TAG_VERSION" = "yes" ]; then
-               _tag=`make_tagver`
-       fi
-       if [ -n "$TAG" ]; then
-               _tag="$TAG"
-       fi
-       echo "tag: $_tag"
-
-       local OPTIONS="tag $CVS_FORCE"
-
-       cd "$PACKAGE_DIR"
-
-       if tag_exist $_tag || [ -n "$CVS_FORCE" ]; then
-               update_shell_title "tag sources: $_tag"
-               git $OPTIONS $_tag || exit
-               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
-}
-
 get_pkgrev() {
        [ -z "$1" ] && return 1
        local _tmp=$(mktemp /tmp/.builder-XXXX)
@@ -1553,12 +1494,8 @@ get_pkgrev() {
 
 set_pkgrev() {
        local _tag
-       if [ "$TAG_VERSION" = "yes" ]; then
-               _tag=`make_tagver`
-       fi
-       if [ -n "$TAG" ]; then
-               _tag="$TAG"
-       fi
+       parse_spec "$1"
+       _tag=`make_pkgrev`
        echo "Writing git revision for tag $_tag"
        local _tmp=$(mktemp /tmp/.builder-XXXX)
        rm $_tmp 2>/dev/null
@@ -1568,7 +1505,7 @@ set_pkgrev() {
        rm $_tmp 2>/dev/null
        [ "$(get_pkgrev "$_tag")" = "$CVSTAG" ] && return 0
        echo "$result" | grep -q -E "^OK$" && return 0
-       echo "$result" | grep -q -E "^EXISTS$" && Exit_error err_tag_exists "$_tag"
+       echo "$result" | grep -q -E "^EXISTS$" && Exit_error err_pkgrev_exists "$_tag"
        Exit_error err_pkgrev_set
 }
 
@@ -1751,12 +1688,22 @@ build_package() {
        local specdir=$(insert_gitlog $SPECFILE)
        ulimit -c unlimited
        # If required exclude directories with systemd related files from package contents
-       if grep -q -E 'systemd(unitdir|userunitdir|tmpfilesdir)' $specdir/$SPECFILE; then
+       if grep -q -E '(lib/(systemd|tmpfiles.d)|systemd(unitdir|userunitdir|tmpfilesdir))' $specdir/$SPECFILE; then
                sed -i -e '/^%exclude_systemd_files/d; /^%files/s/$/\n%exclude_systemd_files/g;' $specdir/$SPECFILE
        fi
+       # Enable/disable distro wide bconds based on ~/.distbcond
+       process_distbcond "$specdir/$SPECFILE"
+       # Add %tld macro to release to allow release control
+       sed -i -r -e '/^Release:/s/%\{\?tld\}//g; s/^Release:\s+(.*)$/Release:\t\1%{?tld}/;' $specdir/$SPECFILE
        # 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
+       PATH=$CLEAN_PATH eval teeboth "'$logfile'" ${TIME_COMMAND} ${NICE_COMMAND} $RPMBUILD $TARGET_SWITCH $BUILD_SWITCH -v $QUIET $CLEAN $RPMOPTS $RPMUSERDEFS $RPMBUILDOPTS $BCOND --define \'_specdir $PACKAGE_DIR\' --define \'_sourcedir $PACKAGE_DIR\' $specdir/$SPECFILE
        retval=$?
+
+       # Set pkgrev if requested and build status is OK
+       if [ ! -z "$SETPKGREV" ] && [ "$SETPKGREV" = "true" ] && [ "$retval" -eq "0" ]; then
+               set_pkgrev "$specdir/$SPECFILE"
+       fi
+
        rm -r $specdir
 
        if [ -n "$logfile" ] && [ -n "$LOGDIROK" ] && [ -n "$LOGDIRFAIL" ]; then
@@ -1851,6 +1798,51 @@ process_bcondrc() {
        update_shell_title "parse ~/.bcondrc: DONE!"
 }
 
+process_distbcond() {
+       # apply bconds from ~/.distbcond to spec
+       # The file structure is like gentoo's package.use:
+       # ---
+       # * -selinux
+       # samba -mysql -pgsql
+       # w32codec-installer license_agreement
+       # php +mysqli
+       # ---
+       if [ -f $HOME/.distbcond ] || ([ -n $HOME_ETC ] && [ -f $HOME_ETC/.distbcond ]); then
+               :
+       else
+               return
+       fi
+
+       SN=${SPECFILE%%\.spec}
+
+       local distbcond=$HOME/.distbcond
+       [ -n $HOME_ETC ] && [ -f $HOME_ETC/.distbcond ] && distbcond=$HOME_ETC/.distbcond
+
+       local bcond_avail=$(find_spec_bcond $SPECFILE)
+
+       while read pkg flags; do
+               # ignore comments
+               [[ "$pkg" == \#* ]] && continue
+
+               # any package or current package?
+               if [ "$pkg" = "*" ] || [ "$pkg" = "$PACKAGE_NAME" ] || [ "$pkg" = "$SN" ]; then
+                       for flag in $flags; do
+                               local opt=${flag#[+-]}
+
+                               # use only flags which are in this package.
+                               if [[ $bcond_avail = *${opt}* ]]; then
+                                       if [[ $flag = -* ]]; then
+                                               sed -i -r -e '/^%bcond_(with|without)\s+'$opt'/s/^%bcond_(with|without)/%bcond_with/g;' "$1"
+                                       elif [[ $flag = +* ]]; then
+                                               sed -i -r -e '/^%bcond_(with|without)\s+'$opt'/s/^%bcond_(with|without)/%bcond_without/g;' "$1"
+                                       fi
+                               fi
+                       done
+               fi
+       done < $distbcond
+       update_shell_title "parse ~/.distbcond: DONE!"
+}
+
 set_bconds_values() {
        update_shell_title "set bcond values"
 
@@ -2082,12 +2074,12 @@ install_build_requires_rpmdeps() {
        local DEPS CNFL
        if [ "$FETCH_BUILD_REQUIRES_RPMGETDEPS" = "yes" ]; then
                # TODO: Conflicts list doesn't check versions
-               CNFL=$(eval rpm-getdeps $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '/^\-/ { print $3 } ' | _rpm_cnfl_check | xargs)
-               DEPS=$(eval rpm-getdeps $BCOND $RPMOPTS $SPECFILE 2> /dev/null | awk '/^\+/ { print $3 } ' | _rpm_prov_check | xargs)
+               CNFL=$(eval rpm-getdeps $BCOND $RPMOPTS $RPMUSERDEFS $SPECFILE 2> /dev/null | awk '/^\-/ { print $3 } ' | _rpm_cnfl_check | xargs)
+               DEPS=$(eval rpm-getdeps $BCOND $RPMOPTS $RPMUSERDEFS $SPECFILE 2> /dev/null | awk '/^\+/ { print $3 } ' | _rpm_prov_check | xargs)
        fi
        if [ "$FETCH_BUILD_REQUIRES_RPMSPECSRPM" = "yes" ]; then
-               CNFL=$(eval rpm -q --specsrpm --conflicts $BCOND $RPMOPTS $SPECFILE | awk '{print $1}' | _rpm_cnfl_check | xargs)
-               DEPS=$(eval rpm -q --specsrpm --requires $BCOND $RPMOPTS $SPECFILE | awk '{print $1}' | _rpm_prov_check | xargs)
+               CNFL=$(eval rpm -q --specsrpm --conflicts $BCOND $RPMOPTS $RPMUSERDEFS $SPECFILE | awk '{print $1}' | _rpm_cnfl_check | xargs)
+               DEPS=$(eval rpm -q --specsrpm --requires $BCOND $RPMOPTS $RPM_USERDEFS $SPECFILE | awk '{print $1}' | _rpm_prov_check | xargs)
        fi
 
        if [ -n "$CNFL" ]; then
@@ -2127,10 +2119,10 @@ init_repository() {
 }
 
 init_rpm_dir() {
-       local TOP_DIR=$(eval $RPM $RPMOPTS --eval '%{_topdir}')
-       local rpmdir=$(eval $RPM $RPMOPTS --eval '%{_rpmdir}')
-       local buildir=$(eval $RPM $RPMOPTS --eval '%{_builddir}')
-       local srpmdir=$(eval $RPM $RPMOPTS --eval '%{_srcrpmdir}')
+       local TOP_DIR=$(eval $RPM $RPMOPTS $RPMUSERDEFS --eval '%{_topdir}')
+       local rpmdir=$(eval $RPM $RPMOPTS $RPMUSERDEFS --eval '%{_rpmdir}')
+       local buildir=$(eval $RPM $RPMOPTS $RPMUSERDEFS --eval '%{_builddir}')
+       local srpmdir=$(eval $RPM $RPMOPTS $RPMUSERDEFS --eval '%{_srcrpmdir}')
        local TEMPLATES=template-specs
        local tmp
 
@@ -2366,33 +2358,6 @@ while [ $# -gt 0 ]; do
                -su | --source-urls)
                        COMMAND="list-sources-urls"
                        shift ;;
-               -Tvs | --tag-version-stable )
-                       COMMAND="tag"
-                       TAG="STABLE"
-                       TAG_VERSION="yes"
-                       shift;;
-               -Ts | --tag-stable )
-                       COMMAND="tag"
-                       TAG="STABLE"
-                       TAG_VERSION="no"
-                       shift;;
-               -Tv | --tag-version )
-                       COMMAND="tag"
-                       TAG=""
-                       TAG_VERSION="yes"
-                       shift;;
-               -Tp | --tag-prefix )
-                       TAG_PREFIX="$2"
-                       shift 2;;
-               -tt | --test-tag )
-                       TEST_TAG="yes"
-                       shift;;
-               -T | --tag )
-                       COMMAND="tag"
-                       shift
-                       TAG="$1"
-                       TAG_VERSION="no"
-                       shift;;
                -ir | --integer-release-only )
                        INTEGER_RELEASE="yes"
                        shift;;
@@ -2421,11 +2386,11 @@ while [ $# -gt 0 ]; do
                        MACRO="${1}"
                        shift
                        if echo "${MACRO}" | grep -q '\W'; then
-                               RPMOPTS="${RPMOPTS} --define \"${MACRO}\""
+                               RPMUSERDEFS="${RPMUSERDEFS} --define \"${MACRO}\""
                        else
                                VALUE="${1}"
                                shift
-                               RPMOPTS="${RPMOPTS} --define \"${MACRO} ${VALUE}\""
+                               RPMUSERDEFS="${RPMUSERDEFS} --define \"${MACRO} ${VALUE}\""
                        fi
                        ;;
                --alt_kernel)
@@ -2471,7 +2436,8 @@ while [ $# -gt 0 ]; do
                        DISTFILES_SERVER=${TLD_DISTFILES_SERVER}
                        ;;
                --pkgrev)
-                       COMMAND="set_pkgrev"
+                       SETPKGREV="true"
+                       COMMAND="build-source"
                        shift;;
                -lp)
                        COMMAND="list_pkgrev"
@@ -2613,35 +2579,6 @@ case "$COMMAND" in
                        fi
                fi
 
-               # ./builder -bs test.spec -r AC-branch -Tp auto-ac- -tt
-               if [ -n "$TEST_TAG" ]; then
-                       local TAGVER=`
-                       make_tagver`
-                       tag_exist $TAGVER || [ $TAGVER = $CVSTAG ] || Exit_error err_tag_exists $TAGVER
-                       # check also tags created in CVS
-                       local TAGVER_CVS=$(echo $TAGVER | tr '[.@]' '[_#]')
-                       local CVSTAG_CVS=$(echo $CVSTAG | tr '[.@]' '[_#]')
-                       tag_exist $TAGVER_CVS || [ $TAGVER_CVS = $CVSTAG_CVS ] \
-                               || Exit_error err_tag_exists $TAGVER_CVS
-                       # - 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 [ "$TAGVER" != "$CVSTAG" -a "$TAGVER_CVS" != "$CVSTAG" -a  "$TREE_PREFIX" != "$TAG_PREFIX" ]; then
-                               TAG_BRANCH="${TREE_PREFIX}-branch"
-                               if [ -n "$DEPTH" ]; then
-                                       cmd_branches="git ls-remote --heads"
-                                       ref_prefix=refs/heads
-                               else
-                                       cmd_branches="git show-ref"
-                                       ref_prefix=refs/remotes/${REMOTE_PLD}
-                               fi
-                               TAG_STATUS=$($cmd_branches | grep -i "${ref_prefix}/$TAG_BRANCH$" | cut -c'-40')
-                               if [ -n "$TAG_STATUS" -a "$TAG_STATUS" != $(git rev-parse "$CVSTAG") ]; then
-                                       Exit_error err_branch_exists "$TAG_STATUS"
-                               fi
-                       fi
-
-               fi
-
                if [ -n "$NOSOURCE0" ] ; then
                        SOURCES=`echo $SOURCES | xargs | sed -e 's/[^ ]*//'`
                fi
@@ -2725,21 +2662,6 @@ case "$COMMAND" in
                fi
                update_md5 $SOURCES $PATCHES
                ;;
-       "tag" )
-               NOURLS=1
-               NODIST="yes"
-               init_builder
-               if [ -z "$SPECFILE" ]; then
-                       Exit_error err_no_spec_in_cmdl
-               fi
-
-               parse_spec
-               if  [ ! -d .git ]; then
-                       echo "No git reposiotory" >&2
-                       exit 101
-               fi
-               tag_files
-               ;;
        "mr-proper" )
                mr_proper
                ;;
@@ -2822,17 +2744,6 @@ case "$COMMAND" in
        "version" )
                echo "$VERSIONSTRING"
                ;;
-       "set_pkgrev" )
-               init_builder
-               if [ -z "$SPECFILE" ]; then
-                       Exit_error err_no_spec_in_cmdl
-               fi
-               get_spec > /dev/null
-               parse_spec
-               set_bconds_values
-               display_bconds
-               set_pkgrev
-               ;;
        "list_pkgrev" )
                init_builder
                if [ -z "$SPECFILE" ]; then