#!/bin/bash

cvmfs_test_name="Import Legacy Repository"
cvmfs_test_autofs_on_startup=false

TEST519_WORKSPACE=""
TEST519_LEGACY_STORAGE=""
TEST519_NEW_REPO_NAME=""
cleanup() {
  [ -z "$TEST519_WORKSPACE" ]      || cd $TEST519_WORKSPACE
  [ -z "$TEST519_NEW_REPO_NAME" ]  || sudo cvmfs_server rmfs -f $TEST519_NEW_REPO_NAME
  [ -z "$TEST519_LEGACY_STORAGE" ] || sudo rm -fR $TEST519_LEGACY_STORAGE
}

cvmfs_run_test() {
  local logfile=$1
  local script_location=$2
  local scratch_dir=$(pwd)

  local guinea_pig_location="${script_location}/../../common/guinea_pig_repo_20"
  local legacy_repo_name="testmigration.cern.ch"
  local repo_dir="/cvmfs/${legacy_repo_name}"
  local legacy_repo_storage="$(get_local_repo_storage $legacy_repo_name)"
  TEST519_WORKSPACE="$scratch_dir"

  echo "make sure there are no legacy repo leftovers from previous tests"
  cleanup_legacy_repo_leftovers "$legacy_repo_name"

  echo "set a trap for desaster cleanup"
  trap cleanup EXIT HUP INT TERM

  echo -n "resurrect legacy repository... "
  TEST519_LEGACY_STORAGE="$legacy_repo_storage"
  plant_tarball "${guinea_pig_location}/keys.tar.gz"                                              || return $?
  plant_legacy_repository_revision "${guinea_pig_location}/revision-6.tar.gz" "$legacy_repo_name" || return $?
  echo "done"

  echo "run the repository migration"
  TEST519_NEW_REPO_NAME="$legacy_repo_name"
  sudo mv $legacy_repo_storage/pub/data $legacy_repo_storage         || return 1
  sudo ln -s $legacy_repo_storage/data $legacy_repo_storage/pub/data || return 2
  sudo cp $legacy_repo_storage/pub/catalogs/.cvmfspublished         \
          $legacy_repo_storage/pub/catalogs/.cvmfswhitelist         \
          $legacy_repo_storage/pub/catalogs/.cvmfs_master_replica   \
          $legacy_repo_storage || return 3
  import_repo "$legacy_repo_name" "$CVMFS_TEST_USER" \
    -l                                               \
    -s                                               \
    -g || return 4

  echo -n "get root catalog hash after migration... "
  local root_clg_after="$(get_current_root_catalog $legacy_repo_name)"
  echo "$root_clg_after"

  echo "download catalog $root_clg_after and check its previous pointer"
  local root_clg_after_db=$(get_and_decompress_root_catalog $legacy_repo_name)
  local prev_ptr="$(sqlite3 $root_clg_after_db "SELECT value FROM properties WHERE key = 'previous_revision';")"
  local root_clg_legacy="07df6f3a10a70ca17df82370ca3845e82ca6a9af"
  echo "  legacy:   $root_clg_legacy"
  echo "  after:    $root_clg_after"
  echo "  prev_ptr: $prev_ptr"
  [ x"$prev_ptr" = x"$root_clg_legacy" ] || return 101

  echo "list newly generated repository under /cvmfs/${legacy_repo_name}"
  ls -lisa /cvmfs/${legacy_repo_name} || return 5

  echo "load repository configuration"
  load_repo_config $legacy_repo_name

  echo "check that the temporary scratch directory is empty"
  [ $(ls ${CVMFS_SPOOL_DIR}/tmp | wc -l) -eq 0 ] || return 50

  # check if the migrated and imported catalogs are sane
  echo "check migrated catalogs and data chunks"
  check_repository $legacy_repo_name || return 6

  echo "create an empty repository revision (exdev workaround)"
  start_transaction $legacy_repo_name || return $?
  publish_repo      $legacy_repo_name || return $?

  if uses_overlayfs $legacy_repo_name; then
    echo "we are running on OverlayFS. We need to erase all hardlinks now..."
    sudo cvmfs_server eliminate-hardlinks -f $legacy_repo_name || return 101
  fi

  # cheate a new repository revision of the migrated catalogs
  echo "create a new repository revision"
  local big_file="${repo_dir}/dir6/bigfile"
  start_transaction $legacy_repo_name || return $?
  cd $repo_dir
    rm -fR dir7                          || return 60
    mkdir -p foo bar                     || return 61
    touch foo/.cvmfscatalog              || return 62
    echo "no meaningful stuff" > foo/bar || return 63
    echo "even less meaning"   > bar/foo || return 64
    ln foo/bar foo/baz                   || return 65
    ln -s ../foo/baz bar/baz             || return 66
    touch $big_file                      || return 67
  cd $scratch_dir
  publish_repo $legacy_repo_name || return $?

  # check if still everything is fine
  echo "check catalogs again"
  check_repository $legacy_repo_name || return 7

  echo "check that the temporary scratch directory is empty"
  [ $(ls ${CVMFS_SPOOL_DIR}/tmp | wc -l) -eq 0 ] || return 50

  # see if the files ended up in the catalog
  echo "check created files"
  local content=$(cat ${repo_dir}/foo/bar)
  [ -f ${repo_dir}/foo/bar ] && grep -q "no meaningful stuff" ${repo_dir}/foo/bar || return 8
  [ -f ${repo_dir}/bar/baz ] && grep -q "no meaningful stuff" ${repo_dir}/bar/baz || return 9

  return 0
}
