| #!/bin/bash |
| |
| JGIT="/bin/jgit" |
| GIT_HOME="/git" |
| |
| function gc_project { |
| proj=$1 |
| |
| PROJECT_PATH=$GIT_HOME/"$proj".git |
| pushd "$PROJECT_PATH" || { |
| status_code=$? |
| err_proj "$proj" "Could not move into $PROJECT_PATH ($status_code). Skipping." |
| return 1 |
| } |
| |
| log_project "$proj" "stats before GC" |
| print_stats "$proj" |
| |
| do_gc |
| |
| log_project "$proj" "stats after GC" |
| print_stats "$proj" |
| |
| popd || { |
| status_code=$? |
| err_proj "$proj" "Could not step out of $PROJECT_PATH ($status_code). Aborting" |
| exit 1 |
| } |
| } |
| |
| function do_gc() { |
| start=$SECONDS |
| $JGIT gc || { |
| status_code=$? |
| err_proj "$proj" "Could not GC $proj ($status_code)." |
| return 1 |
| } |
| end=$SECONDS |
| duration=$(( end - start )) |
| log_project "$proj" "GC took $duration seconds" |
| return 0 |
| } |
| |
| function print_stats { |
| proj=$1 |
| |
| log_project "$proj" "#num_objects: $(count_objects)" |
| |
| for ext in "pack" "bitmap" "idx" "keep"; do |
| log_project "$proj" "#num_$ext: $(count_pack_objects $ext) files" |
| log_project "$proj" "#size_$ext: $(size_pack_objects $ext) Kb" |
| log_project "$proj" "#oldest_$ext: $(oldest_pack_object $ext)" |
| done |
| } |
| |
| function count_pack_objects { |
| find objects/pack -type f -name "*.$1" | wc -l | sed 's/\ //g' |
| } |
| |
| function size_pack_objects { |
| out=$(find objects/pack -type f -name "*.$1" -exec du -ck {} + | grep total$ | cut -d$'\t' -f1) |
| out="${out:-0}" |
| echo "$out" |
| } |
| |
| function oldest_pack_object { |
| out=$(find objects/pack -type f -name "*.$1" -print0 | xargs -0 ls -tl | tail -1) |
| out="${out:-NONE}" |
| echo "$out" |
| } |
| |
| function count_objects { |
| git count-objects | awk '{print $1}' |
| } |
| |
| function now { |
| date '+%s' |
| } |
| |
| function log_project { |
| echo "$(now)|INFO|$1|$2" |
| } |
| |
| function log { |
| echo "$(now)|INFO|$1" |
| } |
| |
| function err_proj { |
| >&2 echo "$(now)|ERROR|$1|$2" |
| } |