support rpmlint in policy check
authorLin Yang <lin.a.yang@intel.com>
Wed, 25 Jul 2012 02:41:40 +0000 (10:41 +0800)
committerLin Yang <lin.a.yang@intel.com>
Wed, 25 Jul 2012 02:41:40 +0000 (10:41 +0800)
DeleteTag.sh
PolicyCheck.sh
SubmitToOBS.sh

index ae94d8f..d783b8f 100755 (executable)
@@ -55,6 +55,10 @@ GERRIT_PATH=$(echo ${GERRIT_PROJECT} | sed "s/^\(.*\)${PROJECT}$/\1/g")
 JENKINS_HOME=$(cd ${WORKSPACE}/../../..; pwd)
 
 #Update gerrit project from remote
+update-git-project ${JENKINS_HOME}/git/${GERRIT_PATH} ${GERRIT_PROJECT}
+if [ $? -eq 0 ]; then
+    cp ${JENKINS_HOME}/git/${GERRIT_PROJECT} ${WORKSPACE} -rf
+fi
 update-git-project ${WORKSPACE} ${GERRIT_PROJECT}
 if [ $? -ne 0 ]; then
     exit 1
@@ -70,7 +74,7 @@ num=$(echo "0"${GERRIT_CHANGE_NUMBER} | sed "s/^.*\(..\)$/\1/g")
 cat ${WORKSPACE}/patchsetid | while IFS= ; read line
 do
     commitid=$(echo ${line} | sed "s/^[[:space:]]*revision:[[:space:]]*\([0-9a-z]*\)$/\1/g")
-    git fetch ssh://${GERRIT_USERNAME}@${GERRIT_HOSTNAME}:${GERRIT_SSHPORT}/${GERRIT_PROJECT} refs/changes/${num}/${GERRIT_CHANGE_NUMBER}/${index}
+    git fetch ssh://${GERRIT_USERNAME}@${GERRIT_HOSTNAME}:${GERRIT_SSHPORT}/${GERRIT_PROJECT} refs/changes/${num}/${GERRIT_CHANGE_NUMBER}/${index} -t
     git checkout FETCH_HEAD
     while [ true ]
     do
index 34f861d..4387fc4 100755 (executable)
@@ -2,8 +2,52 @@
 #Do policy check when a change is created in gerrit
 
 set -x
+
+SPEC_CHECKER=${WORKSPACE}/spec_checker
+cat > $SPEC_CHECKER <<EOF
+#!/usr/bin/env python
+
+import sys
+import tempfile
+sys.path.insert(1, '/usr/share/rpmlint')
+
+from Filter import setRawOut, printed_messages
+import SpecCheck
+import Pkg
+
+import Filter
+
+def quiet(s):
+    pass
+
+Filter.__print=quiet
+
+spec_file=sys.argv[1]
+
+# the tempfile is designed for python policycheck.py, bash script doesn't use it
+output = tempfile.NamedTemporaryFile()
+setRawOut(output.name)
+
+pkg = Pkg.FakePkg(spec_file)
+check = SpecCheck.SpecCheck()
+check.check_spec(pkg, spec_file)
+pkg.cleanup()
+
+from Filter import _rawout
+_rawout.flush()
+print "rpmlint checked %s: %d errors, %s warnings." % (spec_file, printed_messages["E"], printed_messages["W"])
+for line in output.readlines():
+    line = line.strip().lstrip(spec_file+':').strip()
+    if not line.startswith('W:') and not line.startswith('E:'):
+        line = 'line '+line
+    print '- '+line
+
+EOF
+
+chmod a+x $SPEC_CHECKER
+
 #osc wrapper to handle osc random failure
-OSCCMD=/${WORKSPACE}/wrapped_osc
+OSCCMD=${WORKSPACE}/wrapped_osc
 cat > $OSCCMD << DATA
 #!/usr/bin/python
 import sys, locale
@@ -91,73 +135,65 @@ update-git-project()
     done
 }
 
-#Check spec file
-checkspec()
+check_obs_target()
 {
-    spec_check_msg="Auto Policy Check Result:"
+    if [ ! -n "${OBS_STAGING_PROJECT}" -o "${needSR}" = "true" ]; then
+        if [ -n "${destprj}" ]; then
+            destprj=${destprj}" "
+        fi
+        destprj=${destprj}${OBS_DEST_PROJECT}
 
-    if [ ! ${SPECFILE} ]; then
-        if [ -d packaging ]; then
-            if [ $(find ./packaging -name "*\.spec" | wc -l) -eq 1 ]; then
-                SPECFILE=$(find ./packaging -name "*\.spec" | sed "s/.*packaging\/\(.*\)\.spec/\1/g")
+        #Check whether exist spec file under packaging directory
+        if [ -f ${packagingdir}/${SPECFILE}.spec ]; then
+            #Abstract version from spec file
+            cp ${packagingdir}/${SPECFILE}.spec template.spec
+            egrep "^%prep" template.spec
+            if [ $? -ne 0 ]; then
+                echo "%prep" >> template.spec
             fi
-        fi
-        if [ ! ${SPECFILE} ]; then
-            SPECFILE=${PROJECT}
-        fi
-    fi
-    #Check whether exist spec file under packaging directory
-    if [ -f packaging/${SPECFILE}.spec ]; then
-        #Abstract version from spec file
-        cp packaging/${SPECFILE}.spec template.spec
-        egrep "^%prep" template.spec
-        if [ $? -ne 0 ]; then
-            echo "%prep" >> template.spec
-        fi
-        sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{version}\nexit\n/' template.spec > tmp.spec
-        VERSION=$(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3)
-        if [ ! ${VERSION} ]; then
-            VERSION=$(egrep "Version:[ \t]*" tmp.spec | sed "s/.*Version:[ \t]*\(.*\)$/\1/g")
-        fi
-        #Abstract project name from spec file
-        sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{name}\nexit\n/' template.spec > tmp.spec
-        NAME=$(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3)
-        if [ ! ${NAME} ]; then
-            NAME=$(egrep "Name:[ \t]*" tmp.spec | sed "s/.*Name:[ \t]*\(.*\)$/\1/g")
-        fi
-        #Abstract source0 tarball name from spec file
-        sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{SOURCE0}\nexit\n/' template.spec > tmp.spec
-        TARBALL=$(basename $(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3))
-        if [ ! ${TARBALL} ]; then
-            sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{SOURCE}\nexit\n/' template.spec > tmp.spec
-            TARBALL=$(basename $(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3))
-        fi
-        rm tmp.spec template.spec
+            #Abstract project name from spec file
+            sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{name}\nexit\n/' template.spec > tmp.spec
+            NAME=$(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3)
+            if [ ! -n "${NAME}" ]; then
+                NAME=$(egrep "Name:[ \t]*" tmp.spec | sed "s/.*Name:[ \t]*\(.*\)$/\1/g")
+            fi
+            rm tmp.spec template.spec
 
-        if [ "x${direct_submit}" = "xtrue" -o "x${needSR}" = "xtrue" ]; then
-            message="[IMPORTANT NOTICE]:"
             $OSCCMD -A ${OBS_API_URL} -c ${OBS_OSCRC_PATH} ls ${OBS_DEST_PROJECT} | egrep "^${NAME}$"
             if [ $? -ne 0 ]; then
-                message=${message}" [NEW package \"${NAME}\"]"
+                newpkg=true
             fi
-            message=${message}" This change will be submitted to OBS ${OBS_DEST_PROJECT} project !!!"
         fi
+    fi
+    return
+}
 
-        if [ ! "${NAME}" ]; then
-            lack_field="%{name}"
-        fi
-        if [ ! "${VERSION}" ]; then
-            lack_field=${lack_field}" %{version}"
+#Check spec file
+check_spec()
+{
+    if [ -d ${packagingdir} ]; then
+        #Check whether exist spec file under packaging directory
+        if [ -f ${packagingdir}/${SPECFILE}.spec ]; then
+           msg=$($SPEC_CHECKER ${packagingdir}/${SPECFILE}.spec)
+            print ${spec_check_msg}
+        else
+            if [ -n "${lack_spec}" ]; then
+                lack_spec=${lack_spec}" "
+            fi
+            lack_spec=${lack_spec}"${SPECFILE}.spec"
         fi
-        if [ "${lack_field}" ]; then
-            spec_check_msg=${spec_check_msg}" Warning: ${SPECFILE}.spec do not contain ${lack_field} variable."
-            return
+    else
+        msg="Error: Do not contain packaging directory!"
+    fi
+    if [ -n "${msg}" ]; then
+        if [ -n "${spec_check_msg}" ]; then
+            spec_check_msg=${spec_check_msg}"
+
+"
         fi
-        else
-        spec_check_msg=${spec_check_msg}" Error: NOT Contain spec file under packaging directory!"
-        return      
+        spec_check_msg=${spec_check_msg}${msg}
+        msg=""
     fi
-    spec_check_msg=${spec_check_msg}" Passed."
     return
 }
 
@@ -187,6 +223,28 @@ cd ${WORKSPACE}/${PROJECT}
 #Fetch the patch from Gerrit
 git fetch ssh://${GERRIT_USERNAME}@${GERRIT_HOSTNAME}:${GERRIT_SSHPORT}/${GERRIT_PROJECT} ${GERRIT_REFSPEC} -t
 git checkout FETCH_HEAD
+   
+packagingdir=$(readlink packaging)
+if [ ! -n "${packagingdir}" ]; then
+    packagingdir="packaging"
+fi
+git show --pretty="format:" --name-only ${GERRIT_PATCHSET_REVISION} | egrep "${packagingdir}/.*\.changes"
+if [ $? -eq 0 ]; then
+    git describe --tags --exact-match ${GERRIT_PATCHSET_REVISION}
+    if [ $? -eq 0 ]; then
+        needSR=true
+    fi
+fi
+
+if [ -d ${packagingdir} ]; then
+    if [ $(find ./${packagingdir} -name "*\.spec" | wc -l) -eq 1 ]; then
+        default_spec=$(find ./${packagingdir} -name "*\.spec" | sed "s/.*${packagingdir}\/\(.*\)\.spec/\1/g")
+    fi
+    if [ ! -n "${default_spec}" ]; then
+        default_spec=${PROJECT}
+    fi
+fi
 
 #Parse OBS target project from git-obs-mapping configuration. Result "@OBS_project#@#@OBS_staging_project#@#@OBS_package" will be recoreded in ${WORKSPACE}/mapping.txt
 xml sel -t -m "/mapping/project[@name='${GERRIT_PROJECT}' and @submission='N'] | /mapping/project[@name='/${GERRIT_PROJECT}' and @submission='N'] | /mapping/project[@name='${GERRIT_PROJECT}']/branch[@name='${GERRIT_BRANCH}' and @submission='N'] | /mapping/project[@name='/${GERRIT_PROJECT}']/branch[@name='${GERRIT_BRANCH}' and @submission='N']" -v "@name" -n ${JENKINS_HOME}/git/scm/git-obs-mapping/git-obs-mapping.xml
@@ -204,7 +262,7 @@ if [ $? -ne 0 ]; then
             xml sel -t -m "/mapping/default/path[@name='${PATH_NAME}']/branch[@name='${GERRIT_BRANCH}'] | /mapping/default/path[@name='${PATH_NAME}/']/branch[@name='${GERRIT_BRANCH}']" -v "concat(@OBS_project,'#@#',@OBS_staging_project,'#@#',@OBS_package)" -n ${JENKINS_HOME}/git/scm/git-obs-mapping/git-obs-mapping.xml > ${WORKSPACE}/mapping.txt
             if [ $? -eq 0 -a -f ${WORKSPACE}/mapping.txt -a -s ${WORKSPACE}/mapping.txt ]; then
                 break
-            elif [ ! ${PATH_NAME} ]; then
+            elif [ ! -n "${PATH_NAME}" ]; then
                 break
             fi
         done
@@ -212,44 +270,71 @@ if [ $? -ne 0 ]; then
 fi
 
 if [ -f ${WORKSPACE}/mapping.txt -a -s ${WORKSPACE}/mapping.txt ]; then
-    line=$(head -1 ${WORKSPACE}/mapping.txt)
-    if [ ! ${line} ]; then
-        continue
-    fi
-    OBS_DEST_PROJECT=$(echo ${line} | awk -F '#@#' '{print $1}')
-    OBS_STAGING_PROJECT=$(echo ${line} | awk -F '#@#' '{print $2}')
-    SPECFILE=$(echo ${line} | awk -F '#@#' '{print $3}')
-    if [ ! ${OBS_DEST_PROJECT} ]; then
-        exit 0
-    fi
-    if [ ! "${OBS_STAGING_PROJECT}" ]; then
-        direct_submit=true
-        OBS_STAGING_PROJECT=${OBS_DEST_PROJECT}
-    fi
-    git show --pretty="format:" --name-only ${GERRIT_PATCHSET_REVISION} | egrep "packaging/.*\.changes"
-    if [ $? -eq 0 ]; then
-        git describe --tags --exact-match ${GERRIT_PATCHSET_REVISION}
+    for line in $(cat ${WORKSPACE}/mapping.txt)
+    do
+        if [ ! -n "${line}" ]; then
+            continue
+        fi
+        OBS_DEST_PROJECT=$(echo ${line} | awk -F '#@#' '{print $1}')
+        OBS_STAGING_PROJECT=$(echo ${line} | awk -F '#@#' '{print $2}')
+        SPECFILE=$(echo ${line} | awk -F '#@#' '{print $3}')
+        if [ ! -n "${OBS_DEST_PROJECT}" ]; then
+            continue
+        fi
+
+        if [ ! -n "${SPECFILE}" ]; then
+            SPECFILE=${default_spec}
+        fi
+
+        check_obs_target
+
+        #if [ -n "${OBS_STAGING_PROJECT}" -a "${needSR}" != "true" ]; then
+        #    git show --pretty="format:" --name-only ${GERRIT_PATCHSET_REVISION} | egrep "${packagingdir}/${SPECFILE}.spec"
+        #    if [ $? -ne 0 ]; then
+        #        continue
+        #    fi
+        #fi
+
+        egrep "${SPECFILE}.spec" ${WORKSPACE}/speclist
         if [ $? -eq 0 ]; then
-            needSR=true
+            continue
+        else
+            echo "${SPECFILE}.spec" >> ${WORKSPACE}/speclist
         fi
-    fi
 
-    #Do policy check for specfile
-    checkspec
+        #use rpmlint to check specfile
+        check_spec 
+    done
 else
-    message="[IMPORTANT NOTICE]: The project will not be submitted to OBS according configuration in gerrit \"scm/git-obs-mapping\" project. If needed, please modify scm/git-obs-mapping to enable submission to OBS."
+    message="[IMPORTANT NOTICE]: The change for ${GERRIT_BRANCH} branch will not be submitted to OBS according configuration in gerrit \"scm/git-obs-mapping\" project. If needed, please modify scm/git-obs-mapping to enable submission to OBS."
 fi
 
 #Post comment back to gerrit
-if [ "${message}" ]; then
-    message="- "${message}"\n"
-else
-    message="- "
+if [ ! -n "${message}" ]; then
+    message="[IMPORTANT NOTICE]:"
+    if [ -n "${destprj}" ]; then
+        if [ "${newpkg}" = "true" ]; then
+            message=${message}" [New Package]"
+        fi
+        message=${message}" This change will be submitted to OBS ${destprj} project!!!"
+    else
+        message=${message}" This change will not be submitted to OBS. If want to trigger submission to OBS, please make sure this change meets all below criteria.
+- The commit includes changes to the change log file under packaging directory.
+- A tag is created on this commit, and pushed together with the commit to Gerrit at the same time."
+    fi
+fi
+if [ -n "${message}" ]; then
+    ssh -p ${GERRIT_SSHPORT} ${GERRIT_USERNAME}@${GERRIT_HOSTNAME} gerrit review ${GERRIT_CHANGE_NUMBER},${GERRIT_PATCHSET_NUMBER} --message \'"${message}"\' 
+fi
+
+if [ -n "${lack_spec}" ]; then
+    spec_check_msg="Error: Not contain ${lack_spec} under packaging directory!
+
+"${spec_check_msg}
 fi
-if [ "${spec_check_msg}" ]; then
-    message=${message}${spec_check_msg}
+if [ -n "${spec_check_msg}" ]; then
+    ssh -p ${GERRIT_SSHPORT} ${GERRIT_USERNAME}@${GERRIT_HOSTNAME} gerrit review ${GERRIT_CHANGE_NUMBER},${GERRIT_PATCHSET_NUMBER} --message \'"${spec_check_msg}"\' 
 fi
-ssh -p ${GERRIT_SSHPORT} ${GERRIT_USERNAME}@${GERRIT_HOSTNAME} gerrit review ${GERRIT_CHANGE_NUMBER},${GERRIT_PATCHSET_NUMBER} --message \'"$(echo -e ${message})"\' 
 
 #Cleanup and exit
 rm -rf ${WORKSPACE}/* -rf
index 5687688..57368d0 100755 (executable)
@@ -14,7 +14,7 @@ end()
         exit 1
     else
         mysql -h${MYSQL_HOSTNAME} -P${MYSQL_PORT} -u${MYSQL_USERNAME} -p${MYSQL_PASSWORD} -D${MYSQL_DB_NAME} -e "UPDATE ChangeMerged_Event SET state='TRIGGER_FAILURE' WHERE changeNum='${GERRIT_CHANGE_NUMBER}' and patchsetNum='${GERRIT_PATCHSET_NUMBER}'"
-        exit 0
+        exit 1
     fi
 }
 
@@ -83,7 +83,7 @@ obs_checkout()
             (cd ${OBS_PROJECT}/${OBS_PACKAGE} && $OSCCMD ci --skip-validation --force -m "init package")
         fi
         if [ $? -eq 0 -a -d ${OBS_PROJECT}/${OBS_PACKAGE} ]; then
-            if [ "x${direct_submit}" != "xtrue" ]; then
+            if [ "${OBS_STAGING_PROJECT}" != "${OBS_DEST_PROJECT}" ]; then
                 $OSCCMD ls ${OBS_PROJECT} | egrep "^tmp$"
                 if [ $? -ne 0 ]; then
                     (cd ${OBS_PROJECT} && $OSCCMD mkpac tmp)
@@ -188,7 +188,7 @@ if [ $? -ne 0 -o ! -f ${WORKSPACE}/mapping.txt -o ! -s ${WORKSPACE}/mapping.txt
         xml sel -t -m "/mapping/default/path[@name='${PATH_NAME}']/branch[@name='${GERRIT_BRANCH}'] | /mapping/default/path[@name='${PATH_NAME}/']/branch[@name='${GERRIT_BRANCH}']" -v "concat(@OBS_project,'#@#',@OBS_staging_project,'#@#',@OBS_package)" -n ${JENKINS_HOME}/git/scm/git-obs-mapping/git-obs-mapping.xml > ${WORKSPACE}/mapping.txt
         if [ $? -eq 0 -a -f ${WORKSPACE}/mapping.txt -a -s ${WORKSPACE}/mapping.txt ]; then
             break
-        elif [ ! ${PATH_NAME} ]; then
+        elif [ ! -n "${PATH_NAME}" ]; then
             end success
         fi
     done
@@ -206,119 +206,129 @@ fi
 
 cd ${WORKSPACE}/${PROJECT}
 git checkout origin/${GERRIT_BRANCH}
-COMMITLOG=$(git log -1 --format="%h : %s" ${GERRIT_PATCHSET_REVISION})
 
-line=$(head -1 ${WORKSPACE}/mapping.txt)
-if [ ! ${line} ]; then
-    continue
-fi
-cd ${WORKSPACE}/${PROJECT}
-OBS_DEST_PROJECT=$(echo ${line} | awk -F '#@#' '{print $1}')
-OBS_STAGING_PROJECT=$(echo ${line} | awk -F '#@#' '{print $2}')
-SPECFILE=$(echo ${line} | awk -F '#@#' '{print $3}')
-if [ ! "${OBS_DEST_PROJECT}" ]; then
-    end failure
-fi
-if [ ! "${OBS_STAGING_PROJECT}" ]; then
-    direct_submit=true
-    OBS_STAGING_PROJECT=${OBS_DEST_PROJECT}
+packagingdir=$(readlink packaging)
+if [ ! -n "${packagingdir}" ]; then
+    packagingdir="packaging"
 fi
-if [ "x${direct_submit}" != "xtrue" ]; then
-    git show --pretty="format:" --name-only ${GERRIT_PATCHSET_REVISION} | egrep "packaging/.*\.changes"
-    if [ $? -ne 0 ]; then
-        end success
-    else
-        git describe --tags --exact-match ${GERRIT_PATCHSET_REVISION}
-        if [ $? -ne 0 ]; then
-            end success
-        fi
+
+COMMITLOG=$(git log -1 --format="%h : %s" ${GERRIT_PATCHSET_REVISION})
+
+git show --pretty="format:" --name-only ${GERRIT_PATCHSET_REVISION} | egrep "${packagingdir}/.*\.changes"
+if [ $? -eq 0 ]; then
+    git describe --tags --exact-match ${GERRIT_PATCHSET_REVISION}
+    if [ $? -eq 0 ]; then
+        needSR=true
     fi
 fi
 
-#If git-obs-mapping don't indicate use which specfile, use the only one specfile by default
-if [ ! ${SPECFILE} ]; then
-    if [ -d packaging ]; then
-        if [ $(find ./packaging -name "*\.spec" | wc -l) -eq 1 ]; then
-            SPECFILE=$(find ./packaging -name "*\.spec" | sed "s/.*packaging\/\(.*\)\.spec/\1/g")
-        fi
-    fi
-    if [ ! ${SPECFILE} ]; then
-        SPECFILE=${PROJECT}
+for line in $(cat ${WORKSPACE}/mapping.txt)
+do
+    if [ ! -n "${line}" ]; then
+        continue
     fi
-fi
-#Abstract related info from spec file
-if [ -f packaging/${SPECFILE}.spec ]; then
-    cp packaging/${SPECFILE}.spec template.spec
-    egrep "^%prep" template.spec
-    if [ $? -ne 0 ]; then
-        echo "%prep" >> template.spec
+    cd ${WORKSPACE}/${PROJECT}
+    git clean -fd
+
+    OBS_DEST_PROJECT=$(echo ${line} | awk -F '#@#' '{print $1}')
+    OBS_STAGING_PROJECT=$(echo ${line} | awk -F '#@#' '{print $2}')
+    SPECFILE=$(echo ${line} | awk -F '#@#' '{print $3}')
+    if [ ! -n "${OBS_DEST_PROJECT}" ]; then
+        end failure
     fi
-    sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{version}\nexit\n/' template.spec > tmp.spec
-    VERSION=$(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3)
-    if [ ! ${VERSION} ]; then
-        VERSION=$(egrep "Version:[ \t]*" tmp.spec | sed "s/.*Version:[ \t]*\(.*\)$/\1/g")
+    if [ ! -n "${OBS_STAGING_PROJECT}" ]; then
+        OBS_STAGING_PROJECT=${OBS_DEST_PROJECT}
+    else
+        if [ "x${needSR}" != "xtrue" ]; then
+            continue
+        fi
     fi
-    sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{name}\nexit\n/' template.spec > tmp.spec
-    NAME=$(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3)
-    if [ ! ${NAME} ]; then
-        NAME=$(egrep "Name:[ \t]*" tmp.spec | sed "s/.*Name:[ \t]*\(.*\)$/\1/g")
+
+    #If git-obs-mapping don't indicate use which specfile, use the only one specfile by default
+    if [ ! -n "${SPECFILE}" ]; then
+        if [ -d ${packagingdir} ]; then
+            if [ $(find ./${packagingdir} -name "*\.spec" | wc -l) -eq 1 ]; then
+                SPECFILE=$(find ./${packagingdir} -name "*\.spec" | sed "s/.*${packagingdir}\/\(.*\)\.spec/\1/g")
+            fi
+        fi
+        if [ ! -n "${SPECFILE}" ]; then
+            SPECFILE=${PROJECT}
+        fi
     fi
-    sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{SOURCE0}\nexit\n/' template.spec > tmp.spec
-    TARBALL=$(basename $(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3))
-    if [ ! ${TARBALL} ]; then
-        sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{SOURCE}\nexit\n/' template.spec > tmp.spec
+    #Abstract related info from spec file
+    if [ -f ${packagingdir}/${SPECFILE}.spec ]; then
+        cp ${packagingdir}/${SPECFILE}.spec template.spec
+        egrep "^%prep" template.spec
+        if [ $? -ne 0 ]; then
+            echo "%prep" >> template.spec
+        fi
+        sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{version}\nexit\n/' template.spec > tmp.spec
+        VERSION=$(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3)
+        if [ ! -n "${VERSION}" ]; then
+            VERSION=$(egrep "Version:[ \t]*" tmp.spec | sed "s/.*Version:[ \t]*\(.*\)$/\1/g")
+        fi
+        sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{name}\nexit\n/' template.spec > tmp.spec
+        NAME=$(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3)
+        if [ ! -n "${NAME}" ]; then
+            NAME=$(egrep "Name:[ \t]*" tmp.spec | sed "s/.*Name:[ \t]*\(.*\)$/\1/g")
+        fi
+        sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{SOURCE0}\nexit\n/' template.spec > tmp.spec
         TARBALL=$(basename $(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3))
-    fi
-    rm tmp.spec template.spec
-    if [ ! ${NAME} -o ! ${VERSION} ]; then
+        if [ ! -n "${TARBALL}" ]; then
+            sed -e 's/BuildArch:.*//g' -e 's/ExclusiveArch:.*//g' -e 's/^%prep/%prep\necho %{SOURCE}\nexit\n/' template.spec > tmp.spec
+            TARBALL=$(basename $(rpmbuild -bp --nodeps --force tmp.spec --define '_topdir .' --define '_builddir .' --define '_sourcedir .' --define '_rpmdir .' --define '_specdir .' --define '_srcrpmdir .' 2>&1 | grep 'echo' | cut -d ' ' -f 3))
+        fi
+        rm tmp.spec template.spec
+        if [ ! -n "${NAME}" -o ! -n "${VERSION}" ]; then
+            end failure
+        fi
+    else
         end failure
     fi
-else
-    end failure
-fi
-#Use gbs to generate tarball
-gbs export --spec=packaging/${SPECFILE}.spec 
+    #Use gbs to generate tarball
+    gbs export --spec=${packagingdir}/${SPECFILE}.spec 
 
-cd ${WORKSPACE}
-OBS_PACKAGE=${NAME}
-#Checkout OBS package to local
-obs_checkout ${OBS_STAGING_PROJECT} ${OBS_PACKAGE}
-if [ $? -ne 0 ]; then
-    end retry
-fi
-
-#Update files in local OBS package directory    
-cd ${WORKSPACE}/${OBS_STAGING_PROJECT}/${OBS_PACKAGE}
-rm ${WORKSPACE}/${OBS_STAGING_PROJECT}/${OBS_PACKAGE}/* -rf
-cp ${WORKSPACE}/${PROJECT}/packaging/* . -rf
-echo -e "Commit: ${COMMITLOG}\nOwner: ${GERRIT_PATCHSET_UPLOADER_NAME} <${GERRIT_PATCHSET_UPLOADER_EMAIL}>\nGerrit URL: ${GERRIT_CHANGE_URL}\nSubmit Time: $(date +"%x %H:%M:%S")" > ${WORKSPACE}/message.txt
-#Submit code to OBS staging project and create a request to merger to Trunk
-retry_num=3
-while [ $retry_num -ne 0 ]
-do
-    $OSCCMD addremove &&
-    $OSCCMD ci --skip-validation --force -F ${WORKSPACE}/message.txt &&
-    if [ "x${direct_submit}" != "xtrue" ]; then
-        $OSCCMD request list -U ${OBS_USERNAME} ${OBS_DEST_PROJECT} ${OBS_PACKAGE} > ${WORKSPACE}/request.txt &&
-        {
-            REQUEST_ID=$(head -1 ${WORKSPACE}/request.txt | awk '{print $1}')
-            if [ ${REQUEST_ID} ]; then
-                echo -e "" >> ${WORKSPACE}/message.txt
-                $OSCCMD request show ${REQUEST_ID} > ${WORKSPACE}/request.txt &&
-                awk -v key="Message:" '$0==key{p=1;next}/\State:/{p=0}p' ${WORKSPACE}/request.txt >> ${WORKSPACE}/message.txt &&
-                echo "y" | $OSCCMD sr ${OBS_DEST_PROJECT} ${OBS_PACKAGE} -m "$(cat ${WORKSPACE}/message.txt)" --cleanup &&
-                break
-            else
-                $OSCCMD sr ${OBS_DEST_PROJECT} ${OBS_PACKAGE} -m "$(cat ${WORKSPACE}/message.txt)" --cleanup &&
-                break
-            fi
-        }
-    else
-        break
-    fi
-    let "retry_num=retry_num-1"
-    if [ $retry_num -eq 0 ]; then
+    cd ${WORKSPACE}
+    OBS_PACKAGE=${NAME}
+    #Checkout OBS package to local
+    obs_checkout ${OBS_STAGING_PROJECT} ${OBS_PACKAGE}
+    if [ $? -ne 0 ]; then
         end retry
     fi
+
+    #Update files in local OBS package directory    
+    cd ${WORKSPACE}/${OBS_STAGING_PROJECT}/${OBS_PACKAGE}
+    rm ${WORKSPACE}/${OBS_STAGING_PROJECT}/${OBS_PACKAGE}/* -rf
+    cp ${WORKSPACE}/${PROJECT}/${packagingdir}/* ${WORKSPACE}/${OBS_STAGING_PROJECT}/${OBS_PACKAGE} -rf
+    echo -e "Commit: ${COMMITLOG}\nOwner: ${GERRIT_PATCHSET_UPLOADER_NAME} <${GERRIT_PATCHSET_UPLOADER_EMAIL}>\nGerrit URL: ${GERRIT_CHANGE_URL}\nSubmit Time: $(date +"%x %H:%M:%S")" > ${WORKSPACE}/message.txt
+    #Submit code to OBS staging project and create a request to merger to Trunk
+    retry_num=3
+    while [ $retry_num -ne 0 ]
+    do
+        $OSCCMD addremove &&
+        $OSCCMD ci --skip-validation --force -F ${WORKSPACE}/message.txt &&
+        if [ "x${needSR}" = "xtrue" -a "x${OBS_DEST_PROJECT}" != "x${OBS_STAGING_PROJECT}" ]; then
+            $OSCCMD request list -U ${OBS_USERNAME} ${OBS_DEST_PROJECT} ${OBS_PACKAGE} > ${WORKSPACE}/request.txt &&
+            {
+                REQUEST_ID=$(head -1 ${WORKSPACE}/request.txt | awk '{print $1}')
+                if [ -n "${REQUEST_ID}" ]; then
+                    echo -e "" >> ${WORKSPACE}/message.txt
+                    $OSCCMD request show ${REQUEST_ID} > ${WORKSPACE}/request.txt &&
+                    awk -v key="Message:" '$0==key{p=1;next}/\State:/{p=0}p' ${WORKSPACE}/request.txt >> ${WORKSPACE}/message.txt &&
+                    echo "y" | $OSCCMD sr ${OBS_DEST_PROJECT} ${OBS_PACKAGE} -m "$(cat ${WORKSPACE}/message.txt)" --cleanup &&
+                    break
+                else
+                    $OSCCMD sr ${OBS_DEST_PROJECT} ${OBS_PACKAGE} -m "$(cat ${WORKSPACE}/message.txt)" --cleanup &&
+                    break
+                fi
+            }
+        else
+            break
+        fi
+        let "retry_num=retry_num-1"
+        if [ $retry_num -eq 0 ]; then
+            end retry
+        fi
+    done
 done
 end success