#!/bin/sh

set -v -e -x

base="$(realpath "$(dirname "$0")")"
export PATH="$PATH:$base:${MOZ_FETCHES_DIR}/dmg:${MOZ_FETCHES_DIR}/7zz"

cd /builds/worker
mkdir -p /opt/data-reposado artifacts

ROUTE=$(curl -sSL "${TASKCLUSTER_ROOT_URL}/api/queue/v1/task/${TASK_ID}" | jq -r '.routes[] | select(contains("latest")) | select(contains("pushdate") | not)' | sed -e 's/^index\.//')
if test "$ROUTE" && test "$REPOSADO_METADATA_PATH" && test "$TASKCLUSTER_ROOT_URL"; then
  REPOSADO_METADATA_URL="$TASKCLUSTER_ROOT_URL/api/index/v1/task/$ROUTE/artifacts/$REPOSADO_METADATA_PATH"
  rm -f reposado-metadata.tar.gz
  if test `curl --output /dev/null --silent --head --location "$REPOSADO_METADATA_URL" -w "%{http_code}"` = 200; then
    curl -L "$REPOSADO_METADATA_URL" -o reposado-metadata.tar.gz
    tar -zxf reposado-metadata.tar.gz -C /opt/data-reposado
  fi
fi

if [ ! -d /opt/data-reposado/html ] || [ ! -d /opt/data-reposado/metadata ]; then
  mkdir -p /opt/data-reposado/html /opt/data-reposado/metadata
fi

# First, just fetch all the update info.
python3 /usr/local/bin/repo_sync --no-download

# Save the update catalog metadata for reuse in future runs
tar -czf artifacts/reposado-metadata.tar.gz \
  --exclude='html/content/downloads' \
  -C /opt/data-reposado html metadata

# Restore processed-packages list
if test "$ROUTE" && test "$PROCESSED_PACKAGES_PATH" && test "$TASKCLUSTER_ROOT_URL"; then
  PROCESSED_PACKAGES="$TASKCLUSTER_ROOT_URL/api/index/v1/task/$ROUTE/artifacts/$PROCESSED_PACKAGES_PATH"
fi

if test "$PROCESSED_PACKAGES"; then
  rm -f processed-packages
  if test `curl --output /dev/null --silent --head --location "$PROCESSED_PACKAGES" -w "%{http_code}"` = 200; then
    curl -L "$PROCESSED_PACKAGES" | gzip -dc > processed-packages
  elif test -f "$PROCESSED_PACKAGES"; then
    gzip -dc "$PROCESSED_PACKAGES" > processed-packages
  fi
fi

# Next, fetch just the update packages we're interested in.
touch processed-packages
grep -E '^[0-9]+-[0-9]+(::[0-9]+)?$' processed-packages | sort -t- -k1,1nr -k2,2Vr -u > processed-packages.filtered || true
mv processed-packages.filtered processed-packages
rm -f downloaded-packages
touch downloaded-packages

packages=$(python3 "${base}/list-packages.py")

for package in ${packages}; do
  if grep -Fxq "$package" processed-packages; then
    continue
  fi

  tmp_stderr="artifacts/tmp.repo_sync-product-id-${package}.stderr"
  final_stderr="artifacts/repo_sync-product-id-${package}.stderr"

  # repo_sync is super-chatty, let's pipe stderr to separate files
  python3 /usr/local/bin/repo_sync "--product-id=${package}" 2> "$tmp_stderr"

  # Filter out known warning lines
  grep -v "has not been downloaded" "$tmp_stderr" > "$final_stderr" || true

  # Only keep non-empty stderr files
  if [ ! -s "$final_stderr" ]; then
    rm -f "$final_stderr"
  fi

  rm -f "$tmp_stderr"
  echo "$package" >> downloaded-packages

  # Stop downloading packages if we have more than 10 GiB of them to process
  download_size=$(du -B1073741824 -s /opt/data-reposado | cut -f1)
  if [ ${download_size} -gt 10 ]; then
    break
  fi
done

du -sh /opt/data-reposado

# Now scrape symbols out of anything that was downloaded.
mkdir -p symbols tmp
if test -s downloaded-packages; then
  rm -f failed-package-ids successful-packages
  touch failed-package-ids
  env TMP=tmp python3 "${base}/PackageSymbolDumper.py" --failed-package-ids-file=/builds/worker/failed-package-ids --dump_syms=$MOZ_FETCHES_DIR/dump_syms/dump_syms /opt/data-reposado/html/content/downloads /builds/worker/symbols
  grep -Fvx -f failed-package-ids downloaded-packages > successful-packages || true
  cat processed-packages successful-packages | sort -t- -k1,1nr -k2,2Vr -u > processed-packages.merged
  mv processed-packages.merged processed-packages
fi

# Hand out artifacts
gzip -c processed-packages > artifacts/processed-packages.gz

cd symbols
zip -r9 /builds/worker/artifacts/target.crashreporter-symbols.zip ./* || echo "No symbols dumped"
