#!/bin/bash
# Copyright (C) 2022 The Android Open Source Project
#
# 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
#
# 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.

usage() { # exit code
  cat <<-EOF
NAME
    git-gc-preserve - Run git gc and preserve old packs to avoid races for JGit

SYNOPSIS
    git gc-preserve

DESCRIPTION
    Runs git gc and can preserve old packs to avoid races with concurrently
    executed commands in JGit.

    This command uses custom git config options to configure if preserved packs
    from the last run of git gc should be pruned and if packs should be preserved.

    This is similar to the implementation in JGit [1] which is used by
    JGit to avoid errors [2] in such situations.

    The command prevents concurrent runs of the command on the same repository
    by acquiring an exclusive file lock on the file
      "\$repopath/gc-preserve.pid"
    If it cannot acquire the lock it fails immediately with exit code 3.

    Failure Exit Codes
        1: General failure
        2: Couldn't determine repository path. If the current working directory
           is outside of the working tree of the git repository use git option
           --git-dir to pass the root path of the repository.
           E.g.
              $ git --git-dir ~/git/foo gc-preserve
        3: Another process already runs $0 on the same repository

    [1] https://git.eclipse.org/r/c/jgit/jgit/+/87969
    [2] https://git.eclipse.org/r/c/jgit/jgit/+/122288

CONFIGURATION
    "gc.prunepreserved": if set to "true" preserved packs from the last gc run
      are pruned before current packs are preserved.

    "gc.preserveoldpacks": if set to "true" current packs will be hard linked
      to objects/pack/preserved before git gc is executed. JGit will
      fallback to the preserved packs in this directory in case it comes
      across missing objects which might be caused by a concurrent run of
      git gc.
EOF
  exit "$1"
}

# acquire file lock, unlock when the script exits
lock() { # repo
  readonly LOCKFILE="$1/gc-preserve.pid"
  test -f "$LOCKFILE" || touch "$LOCKFILE"
  exec 9> "$LOCKFILE"
  if flock -nx 9; then
    echo -n "$$ $USERNAME@$HOSTNAME" >&9
    trap unlock EXIT
  else
    echo "$0 is already running"
    exit 3
  fi
}

unlock() {
  # only delete if the file descriptor 9 is open
  if { : >&9 ; } &> /dev/null; then
    rm -f "$LOCKFILE"
  fi
  # close the file handle to release file lock
  exec 9>&-
}

# prune preserved packs if gc.prunepreserved == true
prune_preserved() { # repo
  configured=$(git --git-dir="$1" config --get gc.prunepreserved)
  if [ "$configured" != "true" ]; then
    return 0
  fi
  local preserved=$1/objects/pack/preserved
  if [ -d "$preserved" ]; then
    printf "Pruning old preserved packs: "
    count=$(find "$preserved" -name "*.old-pack" | wc -l)
    rm -rf "$preserved"
    echo "$count, done."
  fi
}

# preserve packs if gc.preserveoldpacks == true
preserve_packs() { # repo
  configured=$(git --git-dir="$1" config --get gc.preserveoldpacks)
  if [ "$configured" != "true" ]; then
    return 0
  fi
  local packdir=$1/objects/pack
  pushd "$packdir" >/dev/null || exit 1
  mkdir -p preserved
  printf "Preserving packs: "
  count=0
  for file in pack-*{.pack,.idx} ; do
    ln -f "$file" preserved/"$(get_preserved_packfile_name "$file")"
    if [[ "$file" == pack-*.pack ]]; then
      ((count++))
    fi
  done
  echo "$count, done."
  popd >/dev/null || exit 1
}

# pack-0...2.pack to pack-0...2.old-pack
# pack-0...2.idx to pack-0...2.old-idx
get_preserved_packfile_name() { # packfile > preserved_packfile
  local old=${1/%\.pack/.old-pack}
  old=${old/%\.idx/.old-idx}
  echo "$old"
}

# main

while [ $# -gt 0 ] ; do
    case "$1" in
        -u|-h)  usage 0 ;;
    esac
    shift
done
args=$(git rev-parse --sq-quote "$@")

repopath=$(git rev-parse --git-dir)
if [ -z "$repopath" ]; then
  usage 2
fi

lock "$repopath"
prune_preserved "$repopath"
preserve_packs "$repopath"
git gc ${args:+"$args"} || { echo "git gc failed"; exit "$?"; }
