Blame into_srpm.sh

Pat Riehecky 87c8ae
#!/bin/bash -u
Pat Riehecky 87c8ae
#
Pat Riehecky 87c8ae
# Turn a centos git repo into a .src.rpm file
Pat Riehecky 87c8ae
#
Pat Riehecky 87c8ae
# Might want to drop this in ~/bin/ and chmod u+x it
Pat Riehecky 87c8ae
Pat Riehecky 87c8ae
#
Pat Riehecky 87c8ae
#  License: GPLv2
Pat Riehecky 87c8ae
#
Pat Riehecky 87c8ae
#  Initial Author: Pat Riehecky <riehecky at fnal.gov>
Pat Riehecky 87c8ae
#
Pat Riehecky 87c8ae
Pat Riehecky 87c8ae
#####################################################################
Pat Riehecky 87c8ae
usage() {
Pat Riehecky 87c8ae
    echo ''                                               >&2
733e0e
    echo "$0 [-hqts] [-d dist] [-b branch] [-c shasum]"   >&2
Pat Riehecky 87c8ae
    echo ''                                               >&2
Pat Riehecky 87c8ae
    echo 'You need to run this from inside a sources git repo' >&2
Pat Riehecky 87c8ae
    echo ''                                               >&2
Pat Riehecky 87c8ae
    echo ' -h: This help message'                         >&2
Pat Riehecky 87c8ae
    echo ' -q: Suppress warnings'                         >&2
c429fb
    echo ' -t: Set srpm timestamp to commit date'         >&2
db2f8e
    echo ' -s: Allow building as a SCL style package'     >&2
Pat Riehecky 87c8ae
    echo ''                                               >&2
733e0e
    echo ' -d: Use this %{dist} instead of automatic value'>&2
733e0e
    echo ''                                               >&2
Pat Riehecky 87c8ae
    echo ' -b: specify a branch to examine'               >&2
Pat Riehecky 87c8ae
    echo "     defaults to repo's current branch"         >&2
Pat Riehecky 87c8ae
    echo "     NOTE: your repo will be set to this branch">&2
Pat Riehecky 87c8ae
    echo ''                                               >&2
Pat Riehecky 87c8ae
    echo ' -c: specify a commit id'                       >&2
Pat Riehecky 87c8ae
    echo "     defaults to repo's current commit id"      >&2
Pat Riehecky 87c8ae
    echo "     NOTE: your repo will be set to this commit">&2
Pat Riehecky 87c8ae
    echo ''                                               >&2
Pat Riehecky 87c8ae
    echo "  $0"                                           >&2
db2f8e
    echo "  $0 -b c7 -t"                                  >&2
733e0e
    echo "  $0 -b c7 -s"                                  >&2
733e0e
    echo "  $0 -b c7 -d yourdisthere"                     >&2
Pat Riehecky 87c8ae
    echo "  $0 -b remotes/origin/c7"                      >&2
Pat Riehecky 87c8ae
    echo "  $0 -c 865ae5909b2b5d5fb37971b7ad7960f1fd5a5ffa" >&2
Pat Riehecky 87c8ae
    echo "  $0 -b c7 -c 865ae5909b2b5d5fb37971b7ad7960f1fd5a5ffa" >&2
Pat Riehecky 87c8ae
    exit 1
Pat Riehecky 87c8ae
}
Pat Riehecky 87c8ae
Pat Riehecky 87c8ae
#####################################################################
Pat Riehecky 87c8ae
Pat Riehecky 87c8ae
QUIET=0
c429fb
KEEPTIMESTAMP=0
db2f8e
ALLOWSCL=0
Pat Riehecky 87c8ae
COMMITHASH=""
Pat Riehecky 87c8ae
BRANCH=""
733e0e
DIST=''
Pat Riehecky 87c8ae
Pat Riehecky 87c8ae
#####################################################################
Pat Riehecky 87c8ae
# setup args in the right order for making getopt evaluation
Pat Riehecky 87c8ae
# nice and easy.  You'll need to read the manpages for more info
Pat Riehecky 87c8ae
# utilizing 'while' construct rather than 'for arg' to avoid unnecessary
Pat Riehecky 87c8ae
# shifting of program args
733e0e
args=$(getopt -o htsqb:c:d: -- "$@")
Pat Riehecky 87c8ae
eval set -- "$args"
Pat Riehecky 87c8ae
Pat Riehecky 87c8ae
while [[ 0 -eq 0 ]]; do
Pat Riehecky 87c8ae
    case $1 in
Pat Riehecky 87c8ae
        -- )
Pat Riehecky 87c8ae
            # end of getopt args, shift off the -- and get out of the loop
Pat Riehecky 87c8ae
            shift
Pat Riehecky 87c8ae
            break
Pat Riehecky 87c8ae
           ;;
c429fb
         -t )
db2f8e
            # keep timestamps of commit on srpm
c429fb
            KEEPTIMESTAMP=1
c429fb
            shift
c429fb
           ;;
Pat Riehecky 87c8ae
         -q )
Pat Riehecky 87c8ae
            # suppress warnings
Pat Riehecky 87c8ae
            QUIET=1
Pat Riehecky 87c8ae
            shift
Pat Riehecky 87c8ae
           ;;
db2f8e
         -s )
db2f8e
            # try to detect if this was an SCL and build as such
db2f8e
            ALLOWSCL=1
db2f8e
            shift
db2f8e
           ;;
733e0e
         -d )
733e0e
            # Set %{dist} to this instead the automatic value
733e0e
            DIST=$2
733e0e
            shift
dea6c0
            shift
733e0e
           ;;
Pat Riehecky 87c8ae
         -c )
Pat Riehecky 87c8ae
            # Use this commit id
Pat Riehecky 87c8ae
            COMMITHASH=$2
Pat Riehecky 87c8ae
            shift
Pat Riehecky 87c8ae
            shift
Pat Riehecky 87c8ae
           ;;
Pat Riehecky 87c8ae
         -b )
Pat Riehecky 87c8ae
            # Check this particular branch 
Pat Riehecky 87c8ae
            BRANCH=$2
Pat Riehecky 87c8ae
            shift
Pat Riehecky 87c8ae
            shift
Pat Riehecky 87c8ae
           ;;
Pat Riehecky 87c8ae
         -h )
Pat Riehecky 87c8ae
            # get help
Pat Riehecky 87c8ae
            usage
Pat Riehecky 87c8ae
           ;;
Pat Riehecky 87c8ae
    esac
Pat Riehecky 87c8ae
done
Pat Riehecky 87c8ae
Pat Riehecky 87c8ae
if [[ ! -d .git ]] || [[ ! -d SPECS ]]; then
Pat Riehecky 87c8ae
    echo 'You need to run this from inside a sources git repo' >&2
Pat Riehecky 87c8ae
    exit 1
Pat Riehecky 87c8ae
fi
Pat Riehecky 87c8ae
Pat Riehecky 87c8ae
which git >/dev/null 2>&1
Pat Riehecky 87c8ae
if [[ $? -ne 0 ]]; then
Pat Riehecky 87c8ae
    echo 'You need git in PATH' >&2
Pat Riehecky 87c8ae
    exit 1
Pat Riehecky 87c8ae
fi
Pat Riehecky 87c8ae
Pat Riehecky 87c8ae
which get_sources.sh >/dev/null 2>&1
Pat Riehecky 87c8ae
if [[ $? -ne 0 ]]; then
Pat Riehecky 87c8ae
    echo 'You need get_sources.sh from centos-git-common in PATH' >&2
Pat Riehecky 87c8ae
    exit 1
Pat Riehecky 87c8ae
fi
Pat Riehecky 87c8ae
Pat Riehecky 87c8ae
which return_disttag.sh >/dev/null 2>&1
Pat Riehecky 87c8ae
if [[ $? -ne 0 ]]; then
Pat Riehecky 87c8ae
    echo 'You need return_disttag.sh from centos-git-common in PATH' >&2
Pat Riehecky 87c8ae
    exit 1
Pat Riehecky 87c8ae
fi
Pat Riehecky 87c8ae
db2f8e
which show_possible_srpms.sh >/dev/null 2>&1
db2f8e
if [[ $? -ne 0 ]]; then
db2f8e
    echo 'You need show_possible_srpms.sh from centos-git-common in PATH' >&2
db2f8e
    exit 1
db2f8e
fi
db2f8e
a68f52
if [[ ${ALLOWSCL} -eq 1 ]]; then
a68f52
    rpm -q scl-utils-build >/dev/null 2>&1
a68f52
    if [[ $? -ne 0 ]]; then
a68f52
        echo 'Without scl-utils-build some SCL style sources be parsed' >&2
a68f52
        exit 1
a68f52
    fi
a68f52
fi
a68f52
db2f8e
# Set us to requested branch for further operations
Pat Riehecky 87c8ae
if [[ "x${BRANCH}" != 'x' ]]; then
Pat Riehecky 87c8ae
    if [[ $QUIET -eq 1 ]]; then
Pat Riehecky 87c8ae
        git fetch >/dev/null
Pat Riehecky 87c8ae
        git checkout ${BRANCH} >/dev/null
Pat Riehecky 87c8ae
    else
Pat Riehecky 87c8ae
        git fetch
Pat Riehecky 87c8ae
        git checkout ${BRANCH}
Pat Riehecky 87c8ae
    fi
Pat Riehecky 87c8ae
fi
Pat Riehecky 87c8ae
db2f8e
# Set us to requested commit for further operations
Pat Riehecky 87c8ae
if [[ "x${COMMITHASH}" != 'x' ]]; then
Pat Riehecky 87c8ae
    if [[ $QUIET -eq 1 ]]; then
Pat Riehecky 87c8ae
        git fetch >/dev/null
Pat Riehecky 87c8ae
        git checkout ${COMMITHASH} >/dev/null
Pat Riehecky 87c8ae
    else
Pat Riehecky 87c8ae
        git fetch
Pat Riehecky 87c8ae
        git checkout ${COMMITHASH}
Pat Riehecky 87c8ae
    fi
Pat Riehecky 87c8ae
fi
Pat Riehecky 87c8ae
db2f8e
# Download archive from git.centos.org
Pat Riehecky 87c8ae
if [[ $QUIET -eq 1 ]]; then
Pat Riehecky 87c8ae
    get_sources.sh
Pat Riehecky 87c8ae
else
Pat Riehecky 87c8ae
    get_sources.sh -q
Pat Riehecky 87c8ae
fi
Pat Riehecky 87c8ae
db2f8e
SPECFILE=$(cd SPECS; ls *.spec)
db2f8e
3a0ccf
# determine automatically unless we've got one set
3a0ccf
if [[ "x${DIST}" == 'x' ]]; then
3a0ccf
    if [[ ${QUIET} -eq 1 ]]; then
3a0ccf
        DIST=$(return_disttag.sh -q)
3a0ccf
    else
3a0ccf
        DIST=$(return_disttag.sh)
3a0ccf
    fi
3a0ccf
fi
3a0ccf
db2f8e
# Determine if we are an SCL
db2f8e
ISSCL=0
db2f8e
if [[ ${ALLOWSCL} -eq 1 ]]; then
db2f8e
    mytestsclname='DA39A3EE5E6B4B0D3255BFEF95601890AFD80709'
3a0ccf
    mysclcheck=$(rpm --define "dist ${DIST}" --define "scl ${mytestsclname}" -q --specfile "SPECS/${SPECFILE}" --qf '%{n}-%{v}-%{r}\n' 2>/dev/null | head -n 1)
db2f8e
    echo ${mysclcheck} | grep -q ${mytestsclname}
db2f8e
    if [[ $? -eq 0 ]]; then
db2f8e
        ISSCL=1
3a0ccf
        BASENAME=$(echo ${mysclcheck} | sed -e 's/DA39A3EE5E6B4B0D3255BFEF95601890AFD80709//')
3a0ccf
        RPMNAME=$(show_possible_srpms.sh | head -1)
3a0ccf
        SCLNAME=$(echo ${RPMNAME} | sed -e "s/${BASENAME}.src.rpm//")
db2f8e
        if [[ $(echo ${SCLNAME} | wc -l) -ne 1 ]]; then
db2f8e
            echo "$0 failed to determine unique SCL name" >&2
db2f8e
            echo "Found:"                                 >&2
db2f8e
            echo "${SCLNAME}"                             >&2
db2f8e
        fi
3a0ccf
3a0ccf
        scl_check=$(rpm --define "dist ${DIST}" --define "scl ${SCLNAME}" -q --specfile "SPECS/${SPECFILE}" --qf '%{n}-%{v}-%{r}.src.rpm\n' 2>/dev/null | head -n 1)
3a0ccf
        if [[ "${RPMNAME}" != "${scl_check}" ]]; then
3a0ccf
            echo "$0 failed to verify SCL name" >&2
3a0ccf
            echo "Found:"                       >&2
3a0ccf
            echo "${SCLNAME}"                   >&2
3a0ccf
            echo "made:     ${scl_check}"       >&2
3a0ccf
            echo "expected: ${RPMNAME}"         >&2
3a0ccf
        fi
db2f8e
    fi
db2f8e
fi
db2f8e
db2f8e
# build our rpmopts list
db2f8e
RPMOPTS="-bs --nodeps"
733e0e
db2f8e
# put it all together
db2f8e
if [[ ${ISSCL} -eq 1 ]]; then
db2f8e
    rpmbuild --define "%_topdir `pwd`" ${RPMOPTS} --define "%dist ${DIST}" --define "%scl ${SCLNAME}" SPECS/${SPECFILE}
Pat Riehecky 87c8ae
    RC=$?
Pat Riehecky 87c8ae
else
db2f8e
    rpmbuild --define "%_topdir `pwd`" ${RPMOPTS} --define "%dist ${DIST}" SPECS/${SPECFILE}
Pat Riehecky 87c8ae
    RC=$?
Pat Riehecky 87c8ae
fi
Pat Riehecky 87c8ae
c429fb
if [[ ${KEEPTIMESTAMP} -eq 1 ]]; then
c429fb
    timestamp=$(git log --pretty=%ai -1)
c429fb
    find . -type f -name \*.src.rpm -exec touch -d "${timestamp}" {} \;
c429fb
fi
c429fb
Pat Riehecky 87c8ae
if [[ ${RC} -ne 0 ]]; then
db2f8e
    if [[ ${QUIET} -eq 1 ]]; then
Pat Riehecky 87c8ae
        echo "$0 failed to recreate srpm" >&2
Pat Riehecky 87c8ae
    fi
Pat Riehecky 87c8ae
    exit 1
Pat Riehecky 87c8ae
fi