#!/bin/ash
# 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() { # error_message
  cat <<-EOF
NAME
    git-gc-preserve - Run git gc and preserve old packs to avoid races for 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.

    Don't run multiple instances of this command concurrently on the same
    repository since it does not attempt to implement the file locking
    which git gc --auto does [3].

    [1] https://git.eclipse.org/r/c/jgit/jgit/+/87969
    [2] https://git.eclipse.org/r/c/jgit/jgit/+/122288
    [3] https://github.com/git/git/commit/64a99eb4760de2ce2f0c04e146c0a55c34f50f20

SYNOPSIS
    git gc-preserve

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

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
}

# 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
  local current_pwd=$(pwd)
  cd "$packdir" >/dev/null || exit
  mkdir -p preserved
  printf "Preserving packs: " 1>&2
  count=0
  for file in pack-*.pack pack-*.idx ; do
    ln -f "$file" preserved/"$(get_preserved_packfile_name "$file")"
    case $file in
      pack-*.pack*) count=$(expr $count + 1);;
    esac
  done
  echo "$count, done." 1>&2
  cd $current_pwd >/dev/null || exit
}

# 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
  case "$1" in
    *.pack)
      echo "$(basename -- $1 .pack).old-pack";;
    *.idx)
      echo "$(basename -- $1 .idx).old-idx";;
  esac
}

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

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

prune_preserved "$repopath"
preserve_packs "$repopath"

if test -n "$args"; then
  git gc "$args"
else
  git gc
fi
