#!/bin/sh
# Copyright 2020 The Pigweed Authors
#
# Licensed 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
#
#     https://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.

PREFIX="$PW_ROOT/.bootstrap"
mkdir -p "$PREFIX"

# Update the mtimes on the most recent pw_env_setup executables.
for HASH in $(git --git-dir="$PW_ROOT/.git" --no-pager log --max-count=5 --format=format:%H); do
  if [ -f "$PREFIX/$HASH" ]; then
    touch "$PREFIX/$HASH" &> /dev/null
  fi
done

# Delete any files with an (apparent) age greater than 5 days. This will never
# include the 5 most recent pw_env_setup executables, but if there's been no
# bootstrap call in less than 5 days this could delete all version of
# pw_env_setup. This is acceptable because it's very unlikely there have been
# no commits in a 5 day period, and if there really have been no commits this
# will just re-download that executable in a few lines.
find "$PREFIX" -mtime +5 -exec echo rm {} \;

OS=$(uname -s | tr '[:upper:]' '[:lower:]')
if [ "$OS" = "darwin" ]; then
  OS=mac
fi

ARCH=$(uname -m | tr '[:upper:]' '[:lower:]')
if [ "$ARCH" = "x86_64" ]; then
  ARCH="amd64"
fi

for HASH in $(git --git-dir="$PW_ROOT/.git" --no-pager log --max-count=10 --format=format:%H); do
  URL="https://storage.googleapis.com/pigweed-envsetup/$OS-$ARCH"
  URL="$URL/$HASH/pw_env_setup"
  FILEPATH="$PREFIX/$HASH"

  # First try curl.
  if [ ! -f "$FILEPATH" ]; then
    curl -o "$FILEPATH" "$URL" &> /dev/null
  fi

  # If curl fails try wget.
  if [ ! -f "$FILEPATH" ]; then
    wget -O "$FILEPATH" "$URL" &> /dev/null
  fi

  # If either curl or wget succeeded mark the file executable, print it, and
  # exit. If the file appears to be a text file then it doesn't exist in GCS
  # and we'll try the next one.
  TEXT=$(file --mime "$FILEPATH" | grep text)
  if [ -n "$TEXT" ]; then
    rm "$FILEPATH"
    continue
  fi

  if [ -f "$FILEPATH" ]; then
    chmod a+x "$FILEPATH"
    echo "$FILEPATH"
    exit 0
  fi
done

exit -1
