#!/bin/sh

w=/tmp/gitwork
c=0; commit() { git commit -m "$((c++)) $@"; }
fresh() { cd "$w"/..; rm -rf "$w"; mkdir "$w"; cd "$w"
          git init; commit "initial commit" --allow-empty; }

fresh; mkdir A
for f in a b c d e; do
  echo "some A/$f file" > "A/$f"; git add "A/$f"; commit "add A/$f"
done
for f in a b c d e; do
  echo "revised A/$f file" > "A/$f"; git add "A/$f"; commit "revised A/$f"
done
git mv A/a A/aa; commit "renamed A/a -> A/aa"
git rm A/c; commit "removed A/c"
git mv A B; git mv B/d B/dd; echo "revised B/e file" > B/e; git add B/e
  commit "renamed A->B, with d->dd, and edit to e"
git rm B/b; commit "removed B/b"
echo "revised B/dd file" > B/dd; git add B/dd; commit "revised B/dd"
printf "\nOriginal log\n"
git log --graph --pretty="%h %s"

printf "\n\nTrimming repository\n"
racket /tmp/slice.rkt B /tmp
git filter-branch --index-filter "racket /tmp/prune.rkt /tmp" --prune-empty
printf "\nNew log: should have all of the above commits\n"
git log --graph --pretty="%h %s"
