From 0be6721c85c1f23d744db7eb1f63a33fcffb4479 Mon Sep 17 00:00:00 2001
From: iamqizhao <toqizhao@gmail.com>
Date: Fri, 6 Nov 2015 13:26:24 -0800
Subject: [PATCH] coverage on multiple packages

---
 Makefile    |  2 +-
 coverage.sh | 41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 42 insertions(+), 1 deletion(-)
 create mode 100755 coverage.sh

diff --git a/Makefile b/Makefile
index 5bc38be2..12e84e4e 100644
--- a/Makefile
+++ b/Makefile
@@ -47,4 +47,4 @@ clean:
 	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 00000000..b67e85f2
--- /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"