#!/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

    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].

    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

    [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 "$1"
}

# 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

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