Skip to content
This repository

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP
Fetching contributors…

Cannot retrieve contributors at this time

executable file 173 lines (131 sloc) 6.059 kb
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173
#!/bin/bash
#It is called unsafe so most people stay away from this
#But this script is safe to use if you are trying to publish Lift Framework to sonatype
#as a release version (including Milestones and RC's


## This scripts runs on mac's bash terminal

# Exit on any errors and on unbound vars to be safe
set -o errexit
set -o nounset


BUILDLOG=/tmp/Lift-do-release-`date "+%Y%m%d-%H%M%S"`.log

# This script is an attempt to automate the Lift release process
#
# From Indrajit, the steps on each module (superbuild, framework, examples) are:
#
# 1. git checkout -b <version>
# 2. ./liftsh 'set project.version <version>'
# 3. Edit project/plugins/Plugins.scala to change the version of lift-sbt
# 4. git commit -v -a -m "Prepare for <version>"
# 5. git push origin <version>
# 6. git tag <version>-release
# 7. git push origin <version>-release
# 8. LIFTSH_OPTS="-Dpublish.remote=true -Dsbt.log.noformat=true" ./liftsh clean-cache clean-plugins reload +clean-lib +update +clean +publish
# 9. Wait for happiness

SCRIPTVERSION=0.1

##### Utility functions (break these out into an include?) #####
# Basically yes/no confirmation with customized messages
# Usage: confirm "prompt"
# Returns 0 for yes, 1 for no
function confirm {
    while read -p "$1 [yes/no] " CONFIRM; do
        case "`echo $CONFIRM | tr [:upper:] [:lower:]`" in
            yes)
                return 0
                ;;
            no)
                return 1
                ;;
            *)
                echo "Please enter yes or no"
                ;;
        esac
    done
}

function debug {
    #echo $@
    echo -n ""
}

function die {
    echo $@
    exit 1
}

# Locate our base directory (taken from http://blog.eitchnet.ch/?p=242)
SCRIPT_NAME="${PWD##*/}"
SCRIPT_DIR="${PWD%/*}"

# if the script was started from the base directory, then the
# expansion returns a period
if test "$SCRIPT_DIR" == "." ; then
  SCRIPT_DIR="$PWD"
# if the script was not called with an absolute path, then we need to add the
# current working directory to the relative path of the script
elif test "${SCRIPT_DIR:0:1}" != "/" ; then
  SCRIPT_DIR="$PWD/$SCRIPT_DIR"
fi

echo -e "\n*********************************************************************"
echo -e "SCRIPT_DIR is ${SCRIPT_DIR}"
echo -e "\n*********************************************************************"

##### End Utility Functions #####


echo -e "\n*********************************************************************"
printf "* Lift Full Release build script version %-26s *\n" "$SCRIPTVERSION"
#echo "* Default choices for prompts are marked in capitals *"
printf "*********************************************************************\n\n"

echo -e "Build output logged to $BUILDLOG\n"


# CouchDB will blow up with HTTP proxy set because it doesn't correctly interpret the return codes
set +o nounset
if [ ! -z "${http_proxy}" -o ! -z "${HTTP_PROXY}" ]; then
    echo -e "CouchDB tests will fail with http_proxy set! Please unset and re-run.\n"
    exit
fi
set -o nounset

# First, let's confirm that we really want to release...
confirm "Are you certain you want a release build?" || die "Cancelling release build."

echo -e "\nProceeding...\n"

# Now we need to know what version we're releasing
read -p "Please enter the version of the release: " RELEASE_VERSION

# Sanity check on the release version
if ! echo $RELEASE_VERSION | egrep -x '[0-9]+\.[0-9]+(-(M|RC)[0-9]+)?' > /dev/null; then
    confirm "$RELEASE_VERSION does not appear to be a valid version. Are you sure?" ||
      die "Cencelling release build!"
fi

# Perform a sanity check on the modules first
for MODULE in framework ; do
    cd ${SCRIPT_DIR}/${MODULE}

    echo "We cd'ed into `pwd`"

    # ensure that we're on master, and that we're up-to-date
    CURRENT_BRANCH=`git branch 2> /dev/null | sed -e '/^[^*]/d' -e 's/* \(.*\)/\1/'`
    debug "Current branch for $MODULE is $CURRENT_BRANCH"

    if [ "${CURRENT_BRANCH}" != "master" ]; then
        echo "Currently releases can only be built from master. $MODULE is on branch $CURRENT_BRANCH. Aborting build."
        exit
fi

    # ensure that we don't have any outstanding changes
    if git status | grep -q "Changes not staged for commit" ; then
        die "There are outstanding changes in $MODULE. Aborting build."
    else
        echo "All changes are committed, moving on"
    fi

done

echo -e "\nPre-build tests passed. Initiating release build of LiftWeb version $RELEASE_VERSION\n"

# For the remaining modules, we follow indrajit's steps outlined above
for MODULE in framework ; do
    echo -e "\nStarting build on $MODULE module"
    cd ${SCRIPT_DIR}/${MODULE} || die "Could not change to $MODULE directory!"

    git checkout -b ${RELEASE_VERSION} >> ${BUILDLOG} || die "Error creating work branch!"


    ./liftsh ";set version in ThisBuild := \"${RELEASE_VERSION}\" ; session save " >> ${BUILDLOG} || die "Could not update project version in SBT!"

    git commit -v -a -m "Prepare for ${RELEASE_VERSION}" >> ${BUILDLOG} || die "Could not commit project version change!"

#git push origin ${RELEASE_VERSION} >> ${BUILDLOG} || die "Could not push project version change!"

    git tag ${RELEASE_VERSION}-release >> ${BUILDLOG} || die "Could not tag release!"

#git push origin ${RELEASE_VERSION}-release >> ${BUILDLOG} || die "Could not push release tag!"

    # Do a separate build for each configured Scala version so we don't blow the heap
    for SCALA_VERSION in $(grep crossScalaVersions build.sbt | cut -d '(' -f 2 | sed s/[,\)\"]//g ); do
        echo -n " Building against Scala ${SCALA_VERSION}..."
        if ! ./liftsh ++${SCALA_VERSION} clean update test publish >> ${BUILDLOG} ; then
            echo "failed! See build log for details"
            exit
fi
        echo "complete"
    done

    echo "Build complete for module ${MODULE}"

done

echo -e "\n\nRelease complete!"
echo -e "\n\nPlease update the lift_sbt_2.5 templates!"
echo -e "\n\nand write something about this release on the liftweb.net site."
Something went wrong with that request. Please try again.