From e01eb44f2c9c14cde8106240b5800c8d9c1d4d73 Mon Sep 17 00:00:00 2001
From: Bin Yang <bin.yang@intel.com>
Date: Mon, 28 Oct 2019 07:13:43 +0000
Subject: [PATCH] enable pbr version

Currently all flock packages have a common base version of 1.0 or 1.0.0
defined in specfiles. The build system creates tarballs and whl files
with the base version (without TIS_PATCH_VER) and the version is also
attached the generated RPM file (with TIS_PATCH_VER).

This patch addes PBR (OpenStack's Python Build Reasonableness) support,
which can generate the version by parsing semantically-versioned Git
tags and walking the Git history back to the last release tag.

A new variable named PBR_VERSION is supported in build_srpm.data. If its
is not set, the build system still uses TIS_PATCH_VER like before.
If PBR_VERSION=auto, the build system will generate the version by
PBR and create tarballs, whl files and RPM files with this version.
If PBR_VERSION is set manually, the build system will use it directly.

Story: 2006703
Task: 37014

Change-Id: Ic377e3ae3344b291d2d9c0d0fca8f681d1a007b5
Signed-off-by: Bin Yang <bin.yang@intel.com>
Signed-off-by: Yang, Bin <bin.yang@intel.com>
---
 build-tools/build-srpms-parallel | 12 +++---
 build-tools/build-srpms-serial   | 12 +++---
 build-tools/default_build_srpm   |  6 +++
 build-tools/spec-utils           | 56 ++++++++++++++++------------
 build-tools/srpm-utils           | 64 +++++++++++++++++++++++++-------
 5 files changed, 103 insertions(+), 47 deletions(-)

diff --git a/build-tools/build-srpms-parallel b/build-tools/build-srpms-parallel
index f2610597..2f4f398f 100755
--- a/build-tools/build-srpms-parallel
+++ b/build-tools/build-srpms-parallel
@@ -654,6 +654,7 @@ build_dir_srpm () {
       local COPY_LIST_TO_TAR
       local SRC_DIR
       local TIS_PATCH_VER
+      local PBR_VERSION
       local BUILD_IS_BIG=0
       local BUILD_IS_SLOW=0
 
@@ -751,8 +752,8 @@ build_dir_srpm () {
             return 1
          fi
 
-         echo "srpm_extract_to_git '$ORIG_SRPM_PATH' '$PKG_BASE' '$ROOT_DIR' '$BUILD_DIR' '$PKG_NAME_VER' '$NO_META_PATCH_FLAG' '$TIS_PATCH_VER'"
-         srpm_extract_to_git $ORIG_SRPM_PATH $PKG_BASE $ROOT_DIR $BUILD_DIR $PKG_NAME_VER $NO_META_PATCH_FLAG $TIS_PATCH_VER
+         echo "srpm_extract_to_git '$ORIG_SRPM_PATH' '$PKG_BASE' '$ROOT_DIR' '$BUILD_DIR' '$PKG_NAME_VER' '$NO_META_PATCH_FLAG' '$TIS_PATCH_VER' '$PBR_VERSION'"
+         srpm_extract_to_git $ORIG_SRPM_PATH $PKG_BASE $ROOT_DIR $BUILD_DIR $PKG_NAME_VER $NO_META_PATCH_FLAG $TIS_PATCH_VER $PBR_VERSION
          RC=$?
          if [ $RC -ne 0 ]; then
             if [ $RC -eq 1 ]; then
@@ -819,7 +820,7 @@ build_dir_srpm () {
          done
       fi
 
-      srpm_assemble $FULL_BUILD_DIR $TIS_PATCH_VER
+      srpm_assemble $FULL_BUILD_DIR $TIS_PATCH_VER $PBR_VERSION
       if [ $? -ne 0 ]; then
          echo "ERROR: $FUNCNAME (${LINENO}): failed to assemble srpm for '$PKG_NAME_VER'"
 
@@ -973,6 +974,7 @@ build_dir_spec () {
          local SRC_DIR
          local OPT_DEP_LIST
          local TIS_PATCH_VER
+         local PBR_VERSION
          local BUILD_IS_BIG=0
          local BUILD_IS_SLOW=0
 
@@ -1057,8 +1059,8 @@ build_dir_spec () {
                return 1
             fi
 
-            echo "tar_and_spec_extract_to_git '$SPEC' '$PKG_BASE' '$ROOT_DIR' '$BUILD_DIR' '$PKG_NAME_VER' '$NO_META_PATCH_FLAG' '$TIS_PATCH_VER'"
-            tar_and_spec_extract_to_git "$SPEC" "$PKG_BASE" "$ROOT_DIR" "$BUILD_DIR" "$PKG_NAME_VER" "$NO_META_PATCH_FLAG" "$TIS_PATCH_VER"
+            echo "tar_and_spec_extract_to_git '$SPEC' '$PKG_BASE' '$ROOT_DIR' '$BUILD_DIR' '$PKG_NAME_VER' '$NO_META_PATCH_FLAG' '$TIS_PATCH_VER' '$PBR_VERSION'"
+            tar_and_spec_extract_to_git "$SPEC" "$PKG_BASE" "$ROOT_DIR" "$BUILD_DIR" "$PKG_NAME_VER" "$NO_META_PATCH_FLAG" "$TIS_PATCH_VER" "$PBR_VERSION"
             RC=$?
             if [ $RC -ne 0 ]; then
                if [ $RC -eq 1 ]; then
diff --git a/build-tools/build-srpms-serial b/build-tools/build-srpms-serial
index aa00d8c1..2df1ee71 100755
--- a/build-tools/build-srpms-serial
+++ b/build-tools/build-srpms-serial
@@ -632,6 +632,7 @@ build_dir_srpm () {
       local COPY_LIST_TO_TAR
       local SRC_DIR
       local TIS_PATCH_VER
+      local PBR_VERSION
       local BUILD_IS_BIG=0
       local BUILD_IS_SLOW=0
 
@@ -730,8 +731,8 @@ build_dir_srpm () {
             return 1
          fi
 
-         echo "srpm_extract_to_git '$ORIG_SRPM_PATH' '$PKG_BASE' '$ROOT_DIR' '$BUILD_DIR' '$PKG_NAME_VER' '$NO_META_PATCH_FLAG' '$TIS_PATCH_VER'"
-         srpm_extract_to_git $ORIG_SRPM_PATH $PKG_BASE $ROOT_DIR $BUILD_DIR $PKG_NAME_VER $NO_META_PATCH_FLAG $TIS_PATCH_VER
+         echo "srpm_extract_to_git '$ORIG_SRPM_PATH' '$PKG_BASE' '$ROOT_DIR' '$BUILD_DIR' '$PKG_NAME_VER' '$NO_META_PATCH_FLAG' '$TIS_PATCH_VER' '$PBR_VERSION'"
+         srpm_extract_to_git $ORIG_SRPM_PATH $PKG_BASE $ROOT_DIR $BUILD_DIR $PKG_NAME_VER $NO_META_PATCH_FLAG $TIS_PATCH_VER $PBR_VERSION
          RC=$?
          if [ $RC -ne 0 ]; then
             if [ $RC -eq 1 ]; then
@@ -797,7 +798,7 @@ build_dir_srpm () {
          done
       fi
 
-      srpm_assemble $FULL_BUILD_DIR $TIS_PATCH_VER
+      srpm_assemble $FULL_BUILD_DIR $TIS_PATCH_VER $PBR_VERSION
       if [ $? -ne 0 ]; then
          echo "ERROR: $FUNCNAME (${LINENO}): failed to assemble srpm for '$PKG_NAME_VER'"
          SRPM_FAILED_REBUILD_LIST="$SRPM_FAILED_REBUILD_LIST $TARGET_FOUND"
@@ -948,6 +949,7 @@ build_dir_spec () {
          local SRC_DIR
          local OPT_DEP_LIST
          local TIS_PATCH_VER
+         local PBR_VERSION
          local BUILD_IS_BIG=0
          local BUILD_IS_SLOW=0
 
@@ -1035,8 +1037,8 @@ build_dir_spec () {
                return 1
             fi
 
-            echo "tar_and_spec_extract_to_git '$SPEC' '$PKG_BASE' '$ROOT_DIR' '$BUILD_DIR' '$PKG_NAME_VER' '$NO_META_PATCH_FLAG' '$TIS_PATCH_VER'"
-            tar_and_spec_extract_to_git "$SPEC" "$PKG_BASE" "$ROOT_DIR" "$BUILD_DIR" "$PKG_NAME_VER" "$NO_META_PATCH_FLAG" "$TIS_PATCH_VER"
+            echo "tar_and_spec_extract_to_git '$SPEC' '$PKG_BASE' '$ROOT_DIR' '$BUILD_DIR' '$PKG_NAME_VER' '$NO_META_PATCH_FLAG' '$TIS_PATCH_VER' '$PBR_VERSION'"
+            tar_and_spec_extract_to_git "$SPEC" "$PKG_BASE" "$ROOT_DIR" "$BUILD_DIR" "$PKG_NAME_VER" "$NO_META_PATCH_FLAG" "$TIS_PATCH_VER" "$PBR_VERSION"
             RC=$?
             if [ $RC -ne 0 ]; then
                if [ $RC -eq 1 ]; then
diff --git a/build-tools/default_build_srpm b/build-tools/default_build_srpm
index e562fa0a..48c5123d 100755
--- a/build-tools/default_build_srpm
+++ b/build-tools/default_build_srpm
@@ -18,6 +18,10 @@ if [ $? -ne 0 ]; then
     exit 1
 fi
 
+if [ "x$PBR_VERSION" != "x" ] && [ "x$PBR_VERSION" != "xNA" ]; then
+    VERSION=$PBR_VERSION
+fi
+
 if [ "x$VERSION" == "x" ]; then
     for SPEC in `find $SPECS_BASE -name '*.spec' | sort -V`; do
        SPEC_PATH="$SPEC"
@@ -253,9 +257,11 @@ for SPEC in `ls -1 $BUILD_DIR/SPECS`; do
         echo "SPEC file: $SPEC_PATH"
         echo "SRPM build directory: $BUILD_DIR"
         echo "TIS_PATCH_VER: $TIS_PATCH_VER"
+        echo "PBR_VERSION: $PBR_VERSION"
 
         sed -i -e "1 i%define _tis_build_type $BUILD_TYPE" $SPEC_PATH
         sed -i -e "1 i%define tis_patch_ver $TIS_PATCH_VER" $SPEC_PATH
+        sed -i -e "1 i%define pbr_version $PBR_VERSION" $SPEC_PATH
         rpmbuild -bs $SPEC_PATH --define="%_topdir $BUILD_DIR"  --undefine=dist --define="_tis_dist .tis"
     else
         echo "SRPM build not needed"
diff --git a/build-tools/spec-utils b/build-tools/spec-utils
index 49f0c14d..6e531158 100644
--- a/build-tools/spec-utils
+++ b/build-tools/spec-utils
@@ -4,6 +4,7 @@ spec_query_with_macros () {
    local SPEC_FILE=$1; shift
    local BUILD_DIR=$1; shift
    local TIS_PATCH_VER=$1; shift
+   local PBR_VERSION=$1; shift
    local rc
 
    TMPSPEC=$(mktemp /tmp/spec-utils-XXXXXX)
@@ -13,6 +14,7 @@ spec_query_with_macros () {
       --define="_tis_build_type ${BUILD_TYPE:-std}" \
       --define="_tis_dist .tis" \
       --define="tis_patch_ver ${TIS_PATCH_VER:-0}" \
+      --define="pbr_version ${PBR_VERSION:-0}" \
       --define="platform_release ${PLATFORM_RELEASE:-00.00}" \
       --define="%_topdir $BUILD_DIR" \
       "${@}" \
@@ -78,6 +80,7 @@ spec_evaluate () {
                      _tis_build_type)    MACRO_VALUE="${BUILD_TYPE}" ;;
                      _tis_dist)          MACRO_VALUE=".tis" ;;
                      tis_patch_ver)      MACRO_VALUE="{TIS_PATCH_VER:-0}" ;;
+                     pbr_version)        MACRO_VALUE="{PBR_VERSION:-0}" ;;
                      platform_release)   MACRO_VALUE="$PLATFORM_RELEASE" ;;
                      _topdir)            MACRO_VALUE="$BUILD_DIR" ;;
                      *) ;;
@@ -148,9 +151,9 @@ spec_find_macro_via_rpm () {
    # >&2 echo "spec_find_macro_via_rpm: TARGET=$TARGET"
 
    case "$TARGET" in
-      name|_name)       (spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{NAME}\n' | head -n 1 ; exit ${PIPESTATUS[0]} ); RC=$? ;;
-      version|_version) (spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{VERSION}\n' | head -n 1 ; exit ${PIPESTATUS[0]} ); RC=$? ;;
-      release|_release) (spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{RELEASE}\n' | head -n 1 ; exit ${PIPESTATUS[0]} ); RC=$? ;;
+      name|_name)       (spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{NAME}\n' | head -n 1 ; exit ${PIPESTATUS[0]} ); RC=$? ;;
+      version|_version) (spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{VERSION}\n' | head -n 1 ; exit ${PIPESTATUS[0]} ); RC=$? ;;
+      release|_release) (spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{RELEASE}\n' | head -n 1 ; exit ${PIPESTATUS[0]} ); RC=$? ;;
       *) ;;
    esac
 
@@ -199,6 +202,7 @@ spec_find_tag () {
    local SPEC_FILE=$2
    local RPMBUILD_DIR=$3
    local TIS_PATCH_VER=$4
+   local PBR_VERSION=$5
    local LINE=""
 
    if [ "x$RPMBUILD_DIR" == "x" ];then
@@ -209,7 +213,7 @@ spec_find_tag () {
 
    # Note: ${VAR:-val} is bash syntax for providing a default value.
    #       ie. if $VAR is not set, use 'val' as default value
-   spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} > $SPEC_FILE2
+   spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} > $SPEC_FILE2
    if [ $? != 0 ]; then
       #  spec_query_with_macros can fail on grub2 if it's just a spec file without SOURCES
       \cp $SPEC_FILE $SPEC_FILE2
@@ -326,14 +330,14 @@ spec_list_packages () {
 
    if [ "$bd" == "SPECS" ]; then
        local dd=$(dirname $d)
-       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}\n' --define="%_topdir $dd" 2>> /dev/null 
+       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{name}\n' --define="%_topdir $dd" 2>> /dev/null 
    else
-       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}\n' 2>> /dev/null 
+       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{name}\n' 2>> /dev/null 
    fi
 
    if [ $? -ne 0 ]; then
       #  spec_query_with_macros can fail on grub2 if it's just a spec file without SOURCES
-      local NAME=$(spec_find_tag Name "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
+      local NAME=$(spec_find_tag Name "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
       if [ $? -ne 0 ]; then
          >&2 echo "ERROR: failed to evaluate 'Name'"
          return 1
@@ -353,7 +357,7 @@ spec_list_packages () {
           fi
           # >&2 echo "spec_list_packages: PKG_NAME_TEMP=$PKG_NAME_TEMP"
    
-          PKG_NAME=$(spec_evaluate "$PKG_NAME_TEMP" "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
+          PKG_NAME=$(spec_evaluate "$PKG_NAME_TEMP" "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
           if [ $? -ne 0 ]; then
               >&2 echo "ERROR: failed to evaluate package '$PACKAGE_LINE'"
               return 1
@@ -378,20 +382,20 @@ spec_list_versioned_packages () {
 
    if [ "$bd" == "SPECS" ]; then
        local dd=$(dirname $d)
-       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}\n' --define="%_topdir $dd" 2>> /dev/null 
+       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{name}-%{version}\n' --define="%_topdir $dd" 2>> /dev/null 
    else
-       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}\n' 2>> /dev/null 
+       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{name}-%{version}\n' 2>> /dev/null 
    fi
 
    if [ $? -ne 0 ]; then
       #  spec_query_with_macros can fail on grub2 if it's just a spec file without SOURCES
-      local NAME=$(spec_find_tag Name "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
+      local NAME=$(spec_find_tag Name "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
       if [ $? -ne 0 ]; then
          >&2 echo "ERROR: failed to evaluate 'Name'"
          return 1
       fi
 
-      local VERSION=$(spec_find_tag Version "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
+      local VERSION=$(spec_find_tag Version "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
       echo "$NAME-$VERSION"
    
       grep "^%package" $SPEC_FILE | while read PACKAGE_LINE; do
@@ -407,7 +411,7 @@ spec_list_versioned_packages () {
           fi
           # >&2 echo "spec_list_packages: PKG_NAME_TEMP=$PKG_NAME_TEMP"
    
-          PKG_NAME=$(spec_evaluate "$PKG_NAME_TEMP" "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
+          PKG_NAME=$(spec_evaluate "$PKG_NAME_TEMP" "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
           if [ $? -ne 0 ]; then
               >&2 echo "ERROR: failed to evaluate package '$PACKAGE_LINE'"
               return 1
@@ -431,9 +435,9 @@ spec_name_ver_rel () {
       RPMBUILD_DIR=$(dirname $(dirname $SPEC_FILE))
    fi
 
-   NAME=$(spec_find_tag Name $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
-   VERSION=$(spec_find_tag Version $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
-   RELEASE=$(spec_find_tag Release $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
+   NAME=$(spec_find_tag Name $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
+   VERSION=$(spec_find_tag Version $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
+   RELEASE=$(spec_find_tag Release $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
    echo "$NAME-$VERSION-$RELEASE"
 }
 
@@ -450,21 +454,21 @@ spec_list_ver_rel_packages () {
 
    if [ "$bd" == "SPECS" ]; then
        local dd=$(dirname $d)
-       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}-%{release}\n' --define="%_topdir $dd" 2>> /dev/null 
+       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{name}-%{version}-%{release}\n' --define="%_topdir $dd" 2>> /dev/null 
    else
-       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}-%{release}\n' 2>> /dev/null 
+       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{name}-%{version}-%{release}\n' 2>> /dev/null 
    fi
 
    if [ $? -ne 0 ]; then
       #  spec_query_with_macros can fail on grub2 if it's just a spec file without SOURCES
-      local NAME=$(spec_find_tag Name "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
+      local NAME=$(spec_find_tag Name "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
       if [ $? -ne 0 ]; then
          >&2 echo "ERROR: failed to evaluate 'Name'"
          return 1
       fi
 
-      local VERSION=$(spec_find_tag Version "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
-      local RELEASE=$(spec_find_tag Release "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
+      local VERSION=$(spec_find_tag Version "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
+      local RELEASE=$(spec_find_tag Release "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0})
       echo "$NAME-$VERSION-$RELEASE"
    
       grep "^%package" $SPEC_FILE | while read PACKAGE_LINE; do
@@ -480,7 +484,7 @@ spec_list_ver_rel_packages () {
           fi
           # >&2 echo "spec_list_packages: PKG_NAME_TEMP=$PKG_NAME_TEMP"
    
-          PKG_NAME=$(spec_evaluate "$PKG_NAME_TEMP" "$SPEC_FILE" $RPMBUILD_DIR ${TIS_PATCH_VER:-0})
+          PKG_NAME=$(spec_evaluate "$PKG_NAME_TEMP" "$SPEC_FILE" $RPMBUILD_DIR)
           if [ $? -ne 0 ]; then
               >&2 echo "ERROR: failed to evaluate package '$PACKAGE_LINE'"
               return 1
@@ -505,9 +509,9 @@ spec_list_ver_rel_arch_packages () {
 
    if [ "$bd" == "SPECS" ]; then
        local dd=$(dirname $d)
-       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}-%{release}.%{arch}\n' --define="%_topdir $dd" 2>> /dev/null 
+       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{name}-%{version}-%{release}.%{arch}\n' --define="%_topdir $dd" 2>> /dev/null 
    else
-       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} -q --qf '%{name}-%{version}-%{release}.%{arch}\n' 2>> /dev/null 
+       spec_query_with_macros $SPEC_FILE $RPMBUILD_DIR ${TIS_PATCH_VER:-0} ${PBR_VERSION:-0} -q --qf '%{name}-%{version}-%{release}.%{arch}\n' 2>> /dev/null 
    fi
 }
 
@@ -691,6 +695,10 @@ spec_untar_path () {
 spec_validate_tis_release () {
    local SPEC_FILE=$1
 
+   if rpmspec --define='_tis_dist .tis' -P $SPEC_FILE 2>/dev/null | grep '^Version:' | grep '%{pbr_version}'; then
+      return 0
+   fi
+
    # TIS Release value must include either %{?_tis_dist}.%{tis_patch_ver} or %{tis_patch_ver}%{?_tis_dist}
    # Because spec_query_with_macros defines tis_patch_ver, we're using rpmspec directly here
    rpmspec --define='_tis_dist .tis' -P $SPEC_FILE 2>/dev/null | grep '^Release:' \
diff --git a/build-tools/srpm-utils b/build-tools/srpm-utils
index 84e9045d..73c9254e 100644
--- a/build-tools/srpm-utils
+++ b/build-tools/srpm-utils
@@ -155,8 +155,9 @@ srpm_create_raw_extract_script () {
    local TIS_PATCH_VER=$5
    local RAW_SCRIPT=$6
    local TAR_DIR=$7
+   local PBR_VERSION=${8:-0}
 
-   echo "SPEC_FILE=$SPEC_FILE  ROOT_DIR=$ROOT_DIR  RPMBUILD_DIR=$RPMBUILD_DIR  TARGET_ARCH=$TARGET_ARCH  TIS_PATCH_VER=$TIS_PATCH_VER  RAW_SCRIPT=$RAW_SCRIPT  TAR_DIR=$TAR_DIR"
+   echo "SPEC_FILE=$SPEC_FILE  ROOT_DIR=$ROOT_DIR  RPMBUILD_DIR=$RPMBUILD_DIR  TARGET_ARCH=$TARGET_ARCH  TIS_PATCH_VER=$TIS_PATCH_VER  RAW_SCRIPT=$RAW_SCRIPT  TAR_DIR=$TAR_DIR PBR_VERSION=$PBR_VERSION"
    local BUILD_DIR="$RPMBUILD_DIR/BUILD"
    local ApplyPatchCount=0
 
@@ -184,11 +185,12 @@ srpm_create_raw_extract_script () {
    local SAME=0
 
    # Build the srpm as though for std build, for naming consistency
-   echo "stdbuf -oL -eL rpmbuild -bp $SPEC_FILE --root $ROOT_DIR --define='%_topdir $RPMBUILD_DIR' --define='_tis_dist .tis' --define='tis_patch_ver $TIS_PATCH_VER' --nodeps --target $TARGET_ARCH > $STDOUT_LOG 2> $STDERR_LOG"
+   echo "stdbuf -oL -eL rpmbuild -bp $SPEC_FILE --root $ROOT_DIR --define='%_topdir $RPMBUILD_DIR' --define='_tis_dist .tis' --define='tis_patch_ver $TIS_PATCH_VER' --define='pbr_version $PBR_VERSION' --nodeps --target $TARGET_ARCH > $STDOUT_LOG 2> $STDERR_LOG"
    stdbuf -oL -eL rpmbuild -bp $SPEC_FILE --root $ROOT_DIR \
       --define="%_topdir $RPMBUILD_DIR" \
       --define='_tis_dist .tis' \
       --define="tis_patch_ver $TIS_PATCH_VER" \
+      --define="pbr_version $PBR_VERSION" \
       --define="_tis_build_type $BUILD_TYPE" \
       --nodeps --target $TARGET_ARCH > $STDOUT_LOG 2> $STDERR_LOG
    if [ $? -ne 0 ]; then
@@ -212,6 +214,7 @@ srpm_create_raw_extract_script () {
          --define="%_topdir $RPMBUILD_DIR" \
          --define='_tis_dist .tis' \
          --define="tis_patch_ver $TIS_PATCH_VER" \
+         --define="pbr_version $PBR_VERSION" \
          --define="_tis_build_type $BUILD_TYPE" \
          --nodeps --target $TARGET_ARCH > $STDOUT_LOG 2> $STDERR_LOG
       if [ $? -ne 0 ]; then
@@ -1230,6 +1233,7 @@ srpm_build_std_dictionary () {
 srpm_assemble () {
    local FULL_BUILD_DIR=$1
    local TIS_PATCH_VER=$2
+   local PBR_VERSION=$3
 
    local SPEC_PATH
    local SPEC
@@ -1257,7 +1261,7 @@ srpm_assemble () {
           fi
       fi
 
-      RELEASE=$(spec_find_tag Release "$SPEC_PATH" "$(dirname $(dirname $SPEC_PATH))" "$TIS_PATCH_VER" 2>> /dev/null)
+      RELEASE=$(spec_find_tag Release "$SPEC_PATH" "$(dirname $(dirname $SPEC_PATH))" "$TIS_PATCH_VER" "$PBR_VERSION" 2>> /dev/null)
       if [ $? -ne 0 ]; then
           echo "ERROR: $FUNCNAME (${LINENO}): 'Release' not found in '$SPEC_PATH'"
           RELEASE="0"
@@ -1286,9 +1290,11 @@ srpm_assemble () {
           echo "SPEC file: $SPEC_PATH"
           echo "SRPM build directory: $FULL_BUILD_DIR"
           echo "TIS_PATCH_VER: $TIS_PATCH_VER"
+          echo "PBR_VERSION: $PBR_VERSION"
 
           sed -i -e "1 i%define _tis_build_type $BUILD_TYPE" $SPEC_PATH
           sed -i -e "1 i%define tis_patch_ver $TIS_PATCH_VER" $SPEC_PATH
+          sed -i -e "1 i%define pbr_version $PBR_VERSION" $SPEC_PATH
 
           # Build the srpm as though for std build, for naming consistency
           if [ "x$PLATFORM_RELEASE" == "x" ]; then
@@ -1647,9 +1653,10 @@ tarball_extract () {
    local TIS_PATCH_VER="${12}"
    local OUTPUT_FILE="${13}"
    local NO_META_PATCH=${14}
+   local PBR_VERSION=${15}
    # BUILD_TYPE exported from higher layers 
 
-   echo "tarball_extract  SPEC_DIR=$SPEC_DIR  SPEC=$SPEC  SPEC_GIT=$SPEC_GIT  SOURCE_DIR=$SOURCE_DIR  BRANCH=$BRANCH  ORIG_BRANCH=$ORIG_BRANCH  TAR_DIR=$TAR_DIR  ROOT_DIR=$ROOT_DIR  PKG_DIR=$PKG_DIR  BUILD_DIR=$BUILD_DIR  TARGET_ARCH=$TARGET_ARCH  TIS_PATCH_VER=$TIS_PATCH_VER  OUTPUT_FILE=$OUTPUT_FILE  NO_META_PATCH=$NO_META_PATCH"
+   echo "tarball_extract  SPEC_DIR=$SPEC_DIR  SPEC=$SPEC  SPEC_GIT=$SPEC_GIT  SOURCE_DIR=$SOURCE_DIR  BRANCH=$BRANCH  ORIG_BRANCH=$ORIG_BRANCH  TAR_DIR=$TAR_DIR  ROOT_DIR=$ROOT_DIR  PKG_DIR=$PKG_DIR  BUILD_DIR=$BUILD_DIR  TARGET_ARCH=$TARGET_ARCH  TIS_PATCH_VER=$TIS_PATCH_VER  OUTPUT_FILE=$OUTPUT_FILE  NO_META_PATCH=$NO_META_PATCH PBR_VERSION=$PBR_VERSION"
 
    if [ -f $OUTPUT_FILE ]; then
       \rm -f $OUTPUT_FILE
@@ -1706,8 +1713,8 @@ tarball_extract () {
 
        RAW_SCRIPT=$ROOT_DIR/$PKG_DIR/raw_script
        EXTRACT_SCRIPT=$ROOT_DIR/$PKG_DIR/extract_script
-       echo "srpm_create_raw_extract_script '$SPEC_DIR/$SPEC' '$ROOT_DIR/$PKG_DIR'  '$ROOT_DIR/$BUILD_DIR'  '$TARGET_ARCH' '$TIS_PATCH_VER' '$RAW_SCRIPT' '$TAR_DIR'"
-       srpm_create_raw_extract_script "$SPEC_DIR/$SPEC" "$ROOT_DIR/$PKG_DIR" "$ROOT_DIR/$BUILD_DIR"  "$TARGET_ARCH" "$TIS_PATCH_VER" "$RAW_SCRIPT" "$TAR_DIR"
+       echo "srpm_create_raw_extract_script '$SPEC_DIR/$SPEC' '$ROOT_DIR/$PKG_DIR'  '$ROOT_DIR/$BUILD_DIR'  '$TARGET_ARCH' '$TIS_PATCH_VER' '$RAW_SCRIPT' '$TAR_DIR' '$PBR_VERSION'"
+       srpm_create_raw_extract_script "$SPEC_DIR/$SPEC" "$ROOT_DIR/$PKG_DIR" "$ROOT_DIR/$BUILD_DIR"  "$TARGET_ARCH" "$TIS_PATCH_VER" "$RAW_SCRIPT" "$TAR_DIR" "$PBR_VERSION"
        if [ $? -ne 0 ]; then
            echo "ERROR: $FUNCNAME (${LINENO}): srpm_create_raw_extract_script failed"
            cd $ORIG_DIR
@@ -2194,6 +2201,7 @@ tar_and_spec_extract_to_git () {
    local BRANCH=$5
    local NO_META_PATCH=$6
    local TIS_PATCH_VER=$7
+   local PBR_VERSION=$8
    local USE_GIT=1
    local TARGET_ARCH=x86_64
 
@@ -2344,7 +2352,7 @@ tar_and_spec_extract_to_git () {
       local RPMBUILD_BUILD_DIR=""
       local OUTPUT_FILE="$ROOT_DIR/$PKG_DIR/tarball_extract_result"
 
-      tarball_extract  "$SPEC_DIR"  "$SPEC"  "$SPEC_GIT"  "$SOURCE_DIR"  "$BRANCH"  "$ORIG_BRANCH"  "$TAR_DIR"  "$ROOT_DIR"  "$PKG_DIR"  "$BUILD_DIR"  "$TARGET_ARCH"  "$TIS_PATCH_VER"  "$OUTPUT_FILE"
+      tarball_extract  "$SPEC_DIR"  "$SPEC"  "$SPEC_GIT"  "$SOURCE_DIR"  "$BRANCH"  "$ORIG_BRANCH"  "$TAR_DIR"  "$ROOT_DIR"  "$PKG_DIR"  "$BUILD_DIR"  "$TARGET_ARCH"  "$TIS_PATCH_VER"  "$OUTPUT_FILE" "$NO_META_PATCH" "$PBR_VERSION"
       if [ $? -ne 0 ]; then
          echo "ERROR: $FUNCNAME (${LINENO}): tarball_extract failed while extracting '$SPEC_PATH'"
          cd $ORIG_DIR
@@ -2375,7 +2383,8 @@ srpm_extract_to_git () {
    local BUILD_DIR=$4
    local BRANCH=$5
    local NO_META_PATCH=$6
-   local TIS_PATCH_VER=$7
+   local TIS_PATCH_VER=${7:-0}
+   local PBR_VERSION=${8:-0}
    local USE_GIT=1
    local TARGET_ARCH=x86_64
 
@@ -2491,7 +2500,7 @@ srpm_extract_to_git () {
       local RPMBUILD_BUILD_DIR=""
       local OUTPUT_FILE="$ROOT_DIR/$PKG_DIR/tarball_extract_result"
 
-      tarball_extract  "$SPEC_DIR"  "$SPEC"  "$SPEC_GIT"  "$SOURCE_DIR"  "$BRANCH"  "$ORIG_BRANCH"  "$TAR_DIR"  "$ROOT_DIR"  "$PKG_DIR"  "$BUILD_DIR"  "$TARGET_ARCH"  "$TIS_PATCH_VER" "$OUTPUT_FILE" "$NO_META_PATCH"
+      tarball_extract  "$SPEC_DIR"  "$SPEC"  "$SPEC_GIT"  "$SOURCE_DIR"  "$BRANCH"  "$ORIG_BRANCH"  "$TAR_DIR"  "$ROOT_DIR"  "$PKG_DIR"  "$BUILD_DIR"  "$TARGET_ARCH"  "$TIS_PATCH_VER" "$OUTPUT_FILE" "$NO_META_PATCH" "$PBR_VERSION"
       if [ $? -ne 0 ]; then
          echo "ERROR: $FUNCNAME (${LINENO}): tarball_extract failed while extracting '$ORIG_SRPM_PATH'"
          cd $ORIG_DIR
@@ -2580,8 +2589,8 @@ srpm_extract_to_git () {
             fi
             mkdir -p $RPMBUILD_BUILD_DIR2
 
-            echo "srpm_create_raw_extract_script '$SPEC_DIR/$SPEC' '$ROOT_DIR/$PKG_DIR'  '$ROOT_DIR/$BUILD_DIR'  '$TARGET_ARCH' '$TIS_PATCH_VER' '$RAW_SCRIPT'  '$TAR_DIR'"
-            srpm_create_raw_extract_script "$SPEC_DIR/$SPEC" "$ROOT_DIR/$PKG_DIR"  "$ROOT_DIR/$BUILD_DIR"  "$TARGET_ARCH" "$TIS_PATCH_VER" "$RAW_SCRIPT"  "$TAR_DIR"
+            echo "srpm_create_raw_extract_script '$SPEC_DIR/$SPEC' '$ROOT_DIR/$PKG_DIR'  '$ROOT_DIR/$BUILD_DIR'  '$TARGET_ARCH' '$TIS_PATCH_VER' '$RAW_SCRIPT'  '$TAR_DIR' '$PBR_VERSION'"
+            srpm_create_raw_extract_script "$SPEC_DIR/$SPEC" "$ROOT_DIR/$PKG_DIR"  "$ROOT_DIR/$BUILD_DIR"  "$TARGET_ARCH" "$TIS_PATCH_VER" "$RAW_SCRIPT"  "$TAR_DIR" "$PBR_VERSION"
             if [ $? -ne 0 ]; then
                echo "ERROR: $FUNCNAME (${LINENO}): srpm_create_raw_extract_script post meta-patches failed"
                cd $ORIG_DIR
@@ -3197,6 +3206,21 @@ srpm_git_revision_count_pkg () {
     return 0
 }
 
+srpm_pbr_version () {
+    local SRC_DIR=$1
+    local VER
+
+    pushd $SRC_DIR > /dev/null
+    VER=$(python setup.py -q rpm_version)
+    if [ $? -ne 0 ]; then
+        return 1
+    fi
+    popd > /dev/null
+
+    echo $VER
+    return 0
+}
+
 srpm_source_build_data () {
     local DATA_FILE=$1
     if [ ! -f $DATA_FILE ]; then
@@ -3206,9 +3230,20 @@ srpm_source_build_data () {
     source $DATA_FILE
 
     # TIS_PATCH_VER is mandatory
-    if [ -z "$TIS_PATCH_VER" ]; then
-        >&2 echo "ERROR: $FUNCNAME (${LINENO}): TIS_PATCH_VER must be set in $DATA_FILE"
+    if [ -z "$TIS_PATCH_VER" ] && [ -z "$PBR_VERSION" ]; then
+        >&2 echo "ERROR: $FUNCNAME (${LINENO}): TIS_PATCH_VER or PBR_VERSION must be set in $DATA_FILE"
         return 1
+    elif [[ "$PBR_VERSION" == "auto" ]]; then
+       TIS_PATCH_VER="0"
+       if [ ! -d "$SRC_DIR" ]; then
+          >&2 echo "ERROR: $FUNCNAME (${LINENO}): SRC_DIR must specify a subgit root path"
+          return 1
+       fi
+       PBR_VERSION=$(srpm_pbr_version $SRC_DIR)
+       if [ $? -ne 0 ] || [ "$PBR_VERSION" == "" ]; then
+          >&2 echo "ERROR: $FUNCNAME (${LINENO}): Invalid PBR_VERSION '$PBR_VERSION'"
+          return 1
+       fi
     elif [[ "${TIS_PATCH_VER}" =~ [^0-9] ]]; then
         # Expand TIS_PATCH_VER with supported variables
         local -i PKG_GITREVCOUNT=0
@@ -3252,5 +3287,8 @@ srpm_source_build_data () {
         TIS_PATCH_VER=$((TIS_PATCH_VER))
     fi
 
+     # to avoid mockbuild error
+     PBR_VERSION=${PBR_VERSION:=NA}
+
     return 0
 }