#!/bin/bash
# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

set -ex

if [ -z "$GIT_REPO" ]; then
    export HADOOP_PROTOC_CDH5_PATH=/opt/toolchain/protobuf-2.5.0/bin/protoc
    export HADOOP_OPENSSL_101J_PATH=/opt/toolchain/openssl-1.0.1j

    if [ -z "${DO_MAVEN_DEPLOY}" ]; then
        MAVEN_INST_DEPLOY=install
    else
        MAVEN_INST_DEPLOY=$DO_MAVEN_DEPLOY
    fi
    
# FIXME: this needs to go away once we start using an actuall source tarball
    [ -f pom.xml ] || cd src
    
    if [ ! -d build/hadoop-${FULL_VERSION}/src ]; then
        mkdir -p build/hadoop-${FULL_VERSION}/src 
        tar --exclude='./build/*' -cf - . | (cd build/hadoop-${FULL_VERSION}/src ; tar xf -)
        rm -rf build/hadoop-${FULL_VERSION}/src/cloudera build/hadoop-${FULL_VERSION}/src/.git
    fi
    
    if [ -z "$BUNDLE_SNAPPY" ] ; then
        [ -f /usr/lib/libsnappy.so ] && BUNDLE_SNAPPY="-Dsnappy.prefix=x -Dbundle.snappy=true -Dsnappy.lib=/usr/lib -Drequire.snappy=true"
        [ -f /usr/lib64/libsnappy.so ] && BUNDLE_SNAPPY="-Dsnappy.prefix=x -Dbundle.snappy=true -Dsnappy.lib=/usr/lib64 -Drequire.snappy=true"
    fi

    if [ -z "${DO_MAVEN_DEPLOY}" ]; then
        MAVEN_SSL_FLAGS="-Drequire.openssl -Dopenssl.prefix=$HADOOP_OPENSSL_101J_PATH -Dextra.libhadoop.rpath=/var/lib/hadoop/extra/native"
    else
        MAVEN_SSL_FLAGS=""
    fi
        
# Build artifacts
    MAVEN_SKIP_TESTS="-DskipTests -DskipTest -DskipITs"
    JAVA_OPTS="-Xmx1536m -Xms256m -XX:MaxPermSize=256m" \
        MAVEN_OPTS="-Xmx1536m -Xms256m -XX:MaxPermSize=256m" \
        mvn $BUNDLE_SNAPPY \
        -Pdist -Pnative -Pfuse -Psrc -Dtar -Drequire.fuse=true \
        ${MAVEN_SSL_FLAGS} ${MAVEN_SKIP_TESTS} \
        $MAVEN_INST_DEPLOY \
        "$@" 

    if [ -z "${MAVEN_ONLY}" ]; then
        JAVA_OPTS="-Xmx1536m -Xms256m -XX:MaxPermSize=256m" MAVEN_OPTS="-Xmx1536m -Xms256m -XX:MaxPermSize=256m" mvn site site:stage ${MAVEN_SKIP_TESTS} $@
        
# Copy generated docs
        mkdir -p build/hadoop-${FULL_VERSION}/share/doc/
        cp -r target/staging/hadoop-project/* build/hadoop-${FULL_VERSION}/share/doc/
        
# Rebuild and now mvn deploy the tarball - note the '-pl hadoop-dist' - if we chdir into hadoop-dist and build, it fails.
        JAVA_OPTS="-Xmx1536m -Xms256m -XX:MaxPermSize=256m" MAVEN_OPTS="-Xmx1536m -Xms256m -XX:MaxPermSize=256m" mvn -pl hadoop-dist -Pdist -Psrc -Dtar ${MAVEN_SKIP_TESTS} -Dmaven.javadoc.skip=true -Dmaven.deploy.skip=false $MAVEN_INST_DEPLOY "$@"
        
        (cd build/hadoop-${FULL_VERSION} ; tar --strip-components=1 -xzvf  ../../hadoop-dist/target/hadoop-${FULL_VERSION}.tar.gz)
# (cd build/hadoop-${FULL_VERSION}/src ; tar --strip-components=1 -xzvf  ../../../hadoop-dist/target/hadoop-${FULL_VERSION}.tar.gz)
        (cd build/hadoop-${FULL_VERSION} ; cp -r ../../cloudera .)

# Create an artificial C++ example dir
        mkdir -p build/hadoop-${FULL_VERSION}/examples/{bin,lib} || :
        cp hadoop-tools/hadoop-pipes/target/native/*.a build/hadoop-${FULL_VERSION}/examples/lib
        cp hadoop-tools/hadoop-pipes/target/native/examples/* build/hadoop-${FULL_VERSION}/examples/bin
        cp -r build/hadoop-${FULL_VERSION}/include build/hadoop-${FULL_VERSION}/examples
    fi
    
# Build MR1
    IVY_MIRROR_PROP=${IVY_MIRROR_PROP:-http://repo1.maven.org/maven2/}
    IVY_EXTRA_ARGS="-Dmvnrepo=$IVY_MIRROR_PROP -Drepo.maven.org=$IVY_MIRROR_PROP"
# Copy them into the main build directory to be included in the tarball
    rm -rf hadoop-mapreduce1-project/build
    
    (cd hadoop-mapreduce1-project ; ant \
        -Dreactor.repo=file://$HOME/.m2/repository \
        -Djdiff.stable=0.20.1 \
        -Djdiff.build.dir=build/docs/jdiff-cloudera \
        -propertyfile build.properties -Drepo.maven.org=${IVY_MIRROR_PROP} -Dmvnrepo=${IVY_MIRROR_PROP} \
        ${IVY_EXTRA_ARGS} \
        -propertyfile cloudera/build.properties api-report)
    
    MR1_VERSION=`grep '^version' hadoop-mapreduce1-project/build.properties | cut -f2 -d=`

    mkdir -p hadoop-mapreduce1-project/build/hadoop-${MR1_VERSION}/docs/
    
    (cd hadoop-mapreduce1-project ; ant \
        -Dreactor.repo=file://$HOME/.m2/repository \
        -Dforrest.home=$FORREST_HOME \
        -Dcompile.native=true -Dcompile.c++=true \
        -Dhadoop.conf.dir=/etc/hadoop/conf \
        -propertyfile cloudera/build.properties -Drepo.maven.org=${IVY_MIRROR_PROP} -Dmvnrepo=${IVY_MIRROR_PROP} \
        ${IVY_EXTRA_ARGS} \
        task-controller package-native tar)
    
    mv hadoop-mapreduce1-project/build/hadoop-${MR1_VERSION} hadoop-mapreduce1-project/build/hadoop-mr1

    if [ -n "$DO_MAVEN_DEPLOY" ]; then
# Change to cloudera/maven directory, and install
# (and if called from CDH nightly build, deploy) artifacts into Maven repository
        (cd hadoop-mapreduce1-project/cloudera/maven-packaging ; mvn -Dnot.cdh.release.build=false $DO_MAVEN_DEPLOY)
    fi

    if [ -z "${MAVEN_ONLY}" ]; then
# Create a manifest for the hadoop-0.20-client
        (cd hadoop-mapreduce1-project/cloudera/maven-packaging/hadoop-client ; mvn assembly:single)
        (cd hadoop-mapreduce1-project/cloudera/maven-packaging/hadoop-client/target/hadoop-client*/client ; ls) > hadoop-mapreduce1-project/build/hadoop-mr1/hadoop-client.list
        
# Move MR1 bits into the final destination
        mkdir -p build/hadoop-${FULL_VERSION}/share/hadoop/mapreduce1
        mv build/hadoop-${FULL_VERSION}/share/hadoop/mapreduce build/hadoop-${FULL_VERSION}/share/hadoop/mapreduce2
        ln -s mapreduce2 build/hadoop-${FULL_VERSION}/share/hadoop/mapreduce
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/*.jar build/hadoop-${FULL_VERSION}/share/hadoop/mapreduce1
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/lib build/hadoop-${FULL_VERSION}/share/hadoop/mapreduce1
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/contrib build/hadoop-${FULL_VERSION}/share/hadoop/mapreduce1
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/webapps build/hadoop-${FULL_VERSION}/share/hadoop/mapreduce1
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/docs build/hadoop-${FULL_VERSION}/share/doc/hadoop-mapreduce1
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/*.txt build/hadoop-${FULL_VERSION}/share/doc/hadoop-mapreduce1
        
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/conf build/hadoop-${FULL_VERSION}/etc/hadoop-mapreduce1
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/example-confs/conf.pseudo build/hadoop-${FULL_VERSION}/etc/hadoop-mapreduce1-pseudo
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/example-confs/conf.secure build/hadoop-${FULL_VERSION}/etc/hadoop-mapreduce1-secure
        
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/bin build/hadoop-${FULL_VERSION}/bin-mapreduce1
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/sbin/* build/hadoop-${FULL_VERSION}/sbin
        mv -f hadoop-mapreduce1-project/build/hadoop-mr1/hadoop-client.list build/hadoop-${FULL_VERSION}/cloudera/hadoop-mapreduce1-client.list
        
        mv -f hadoop-mapreduce1-project/build/c++-examples build/hadoop-${FULL_VERSION}/examples-mapreduce1
        cp -r hadoop-mapreduce1-project/build/c++/* build/hadoop-${FULL_VERSION}/examples-mapreduce1
        
# Creating a convenience symlink for MR1, this has no effect on any packaging work
# or using MR1 or MR2 from tarballs. It's just one less step you have do *if*
# you were using MR1 from tarballs.
        (cd build/hadoop-${FULL_VERSION}/share/hadoop/mapreduce1 && ln -s ../../../bin-mapreduce1/ bin)
        
        BIN_EXCLUDE="--exclude=*/lib/native/lib*        \
             --exclude=*/examples*/bin/*            \
             --exclude=*/examples*/lib/*            \
             --exclude=*/bin/container-executor     \
             --exclude=*/bin/test-container-executor"
        (cd build && tar $BIN_EXCLUDE -czf hadoop-${FULL_VERSION}.tar.gz hadoop-${FULL_VERSION})
        
# Copy fuse output to the build directory
        cp hadoop-hdfs-project/hadoop-hdfs/target/native/main/native/fuse-dfs/fuse_dfs build/hadoop-${FULL_VERSION}/bin/
        
# Create a manifest for hadoop client package
        (cd hadoop-client/target/hadoop-client-*/share/hadoop/client/lib ; ls) > build/hadoop-${FULL_VERSION}/hadoop-client.list
        
# Create a manifest for hadoop MR1 client package
        (cd hadoop-mapreduce1-project/cloudera/maven-packaging/hadoop-client/target/hadoop-client-*/client/ ; ls) > build/hadoop-${FULL_VERSION}/hadoop-mr1-client.list
    fi
else
    git add .
    git commit -a -m "Temporary commit for tarball"
    mkdir -p build
    git archive --prefix=hadoop-${FULL_VERSION}/ --format=tar HEAD |gzip > build/hadoop-${FULL_VERSION}.tar.gz
fi
