Add more JGit GC config options

Introduce more variables for configuring the JGit execution:

- PACK_THREADS: number of threads for packing concurrently
- JAVA_ARGS: extra JVM options to pass to the JGit JVM
- PRUNE_EXPIRE: interval for unreferenced loose objects expire
- GIT: path where to find the 'git' executable
- GIT_GC_OPTION: option to pass to the JGit GC command line

Also, JAVA_ARGS would automatically set the JVM heap needed
to complete a full GC cycle as twice the current size of the
repository.

Change-Id: If5953e9cc25f25bb344aabb030adb4dd33791dfb
diff --git a/maintenance/git-gc/scripts/utils.sh b/maintenance/git-gc/scripts/utils.sh
index f0d9a14..5d6597b 100755
--- a/maintenance/git-gc/scripts/utils.sh
+++ b/maintenance/git-gc/scripts/utils.sh
@@ -1,8 +1,12 @@
 #!/bin/bash
 
-JGIT=${JGIT:-"/bin/jgit"}
+JGIT=${JGIT:-$(which jgit)}
+GIT=${GIT:-$(which git)}
 GIT_HOME=${GIT_HOME:-"/git"}
-GIT_GC_OPTION=${GIT_GC_OPTION:-"--preserve-oldpacks"}
+GIT_GC_OPTION=${GIT_GC_OPTION:-""}
+PACK_THREADS=${PACK_THREADS:-""}
+PRUNE_EXPIRE=${PRUNE_EXPIRE:-""}
+PRUNE_PACK_EXPIRE=${PRUNE_PACK_EXPIRE:-""}
 
 function gc_project {
   proj=$1
@@ -29,10 +33,21 @@
   }
 }
 
+function java_heap_for_repo() {
+  MIN_SIZE=1048576
+  REPO_SIZE_X2=$(expr $(du -s -k . | cut -f 1) '*' 2)
+  [ $REPO_SIZE_X2 -gt $MIN_SIZE ] && echo $REPO_SIZE_X2 || echo $MIN_SIZE
+}
+
 function do_gc() {
-    log_project "$proj" "Running $JGIT gc $GIT_GC_OPTION ..."
+    [ -z "$PRUNE_PACK_EXPIRE" ] || $GIT config gc.prunePackExpire $PRUNE_PACK_EXPIRE
+    [ -z "$PRUNE_EXPIRE" ] || $GIT config gc.pruneExpire $PRUNE_EXPIRE
+    [ -z "$PACK_THREADS" ] || $GIT config gc.packThreads $PACK_THREADS
+
+    JAVA_ARGS="$JAVA_ARGS -Xmx$(java_heap_for_repo)k"
+    log_project "$proj" "Running java_args=\"$JAVA_ARGS\" $JGIT gc $GIT_GC_OPTION ..."
     start=$SECONDS
-    $JGIT gc $GIT_GC_OPTION || {
+    java_args=$JAVA_ARGS $JGIT gc $GIT_GC_OPTION || {
       status_code=$?
       err_proj "$proj" "Could not GC $proj ($status_code)."
       return 1