coverage on multiple packages
diff --git a/Makefile b/Makefile
index 5bc38be..12e84e4 100644
--- a/Makefile
+++ b/Makefile
@@ -47,4 +47,4 @@
 	go clean google.golang.org/grpc/...
 
 coverage: testdeps
-	goveralls -v google.golang.org/grpc/...
+	./coverage.sh --coveralls
diff --git a/coverage.sh b/coverage.sh
new file mode 100755
index 0000000..b67e85f
--- /dev/null
+++ b/coverage.sh
@@ -0,0 +1,41 @@
+#!/bin/bash
+
+set -e
+
+workdir=.cover
+profile="$workdir/cover.out"
+mode=count
+
+generate_cover_data() {
+    rm -rf "$workdir"
+    mkdir "$workdir"
+
+    for pkg in "$@"; do
+        f="$workdir/$(echo $pkg | tr / -).cover"
+        go test -covermode="$mode" -coverprofile="$f" "$pkg"
+    done
+
+    echo "mode: $mode" >"$profile"
+    grep -h -v "^mode:" "$workdir"/*.cover >>"$profile"
+}
+
+show_cover_report() {
+    go tool cover -${1}="$profile"
+}
+
+push_to_coveralls() {
+    goveralls -coverprofile="$profile"
+}
+
+generate_cover_data $(go list ./...)
+show_cover_report func
+push_to_coveralls
+case "$1" in
+"")
+    ;;
+--coveralls)
+    push_to_coveralls ;;
+*)
+    echo >&2 "error: invalid option: $1" ;;
+esac
+rm -rf "$workdir"