#!/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.
# ----------------------------------------------------------------------------

# Run a standard build
function build() {
  echo "Building ..."
  mvn -U -P apache-release,with-boost,with-dotnet,with-cpp,with-python,with-proxies,with-sandbox,with-logstash -DaltDeploymentRepository=snapshot-repo::default::file:./local-snapshots-dir clean deploy
  echo "Done"
}

# Just remove all the metadata information and all the hashes and signatures
function clean() {
  echo "Cleaning ..."
  cd local-snapshots-dir || exit
  find ./ -name "*.asc" -exec rm -rf {} \;
  find ./ -name "*.md5" -exec rm -rf {} \;
  find ./ -name "*.sha1" -exec rm -rf {} \;
  find ./ -name "maven-metadata.xml" -exec rm -rf {} \;
  find ./ -name "maven-metadata.xml.md5" -exec rm -rf {} \;
  find ./ -name "maven-metadata.xml.sha1" -exec rm -rf {} \;
  cd ..
  echo "Done"
  pwd
}

# Rename all snapshot files to not contain the timestamps
function renameArtifacts() {
  echo "Renaming ..."
  cd local-snapshots-dir || exit
  # Remove the timestamp from the file-names
  find . -type f | rename 's/-\d{8}\.\d{6}-\d{1,2}//'
  cd ..
  echo "Done"
  pwd
}

# Package the remaiing files into one tgz archive
function packageDirectory() {
  echo "Packaging ..."
  tar -cvf reproducible-build-candidate.tgz local-snapshots-dir/
  echo "Done"
  pwd
}

# Remove any pre-existing directory
rm -r local-snapshots-dir

build
clean
renameArtifacts
packageDirectory
