#!/bin/sh
set -eu

source_directory=${1:?usage: build-dstack-mr SOURCE_DIRECTORY OUTPUT_FILE SOURCE_REVISION}
output_file=${2:?usage: build-dstack-mr SOURCE_DIRECTORY OUTPUT_FILE SOURCE_REVISION}
source_revision=${3:?usage: build-dstack-mr SOURCE_DIRECTORY OUTPUT_FILE SOURCE_REVISION}
case "$source_revision" in
  *[!0-9a-f]*|'') echo 'SOURCE_REVISION must be a full lowercase Git SHA' >&2; exit 2 ;;
esac
test "${#source_revision}" -eq 40
builder_image='rust:1.92.0@sha256:48851a839d6a67370c9dbe0e709bedc138e3e404b161c5233aedcf2b717366e4'

case "$source_directory" in
  /*) ;;
  *) echo 'SOURCE_DIRECTORY must be absolute' >&2; exit 2 ;;
esac
case "$output_file" in
  /*) ;;
  *) echo 'OUTPUT_FILE must be absolute' >&2; exit 2 ;;
esac

test "$(git -C "$source_directory" rev-parse HEAD)" = "$source_revision"
test -z "$(git -C "$source_directory" status --porcelain)"
test ! -e "$output_file"
output_directory=$(dirname -- "$output_file")
output_name=$(basename -- "$output_file")
mkdir -p "$output_directory"

docker run --rm --platform linux/amd64 --network bridge \
  --mount "type=bind,src=$source_directory,dst=/src,readonly" \
  --mount "type=bind,src=$output_directory,dst=/out" \
  --env SOURCE_REVISION="$source_revision" \
  --env OUTPUT_NAME="$output_name" \
  "$builder_image" bash -c '
    set -euo pipefail
    git config --global --add safe.directory /src
    test "$(git -C /src rev-parse HEAD)" = "$SOURCE_REVISION"
    test -z "$(git -C /src status --porcelain)"
    rustup target add x86_64-unknown-linux-musl >/dev/null
    cp -a /src/. /build/
    cd /build
    git config --global --add safe.directory /build
    export CARGO_INCREMENTAL=0
    export SOURCE_DATE_EPOCH="$(git show -s --format=%ct HEAD)"
    export RUSTFLAGS="--remap-path-prefix=/build=/usr/src/dstack -C link-arg=-Wl,--build-id=none -C strip=symbols"
    cargo build --locked --release -q -p dstack-mr-cli --target x86_64-unknown-linux-musl
    install -m 0555 target/x86_64-unknown-linux-musl/release/dstack-mr "/out/$OUTPUT_NAME"
  '
