diff --git a/review.go b/review.go
index e638d6a..40e6b76 100644
--- a/review.go
+++ b/review.go
@@ -94,11 +94,11 @@
 
 func create(name string) {
 	if !hasStagedChanges() {
-		dief("No staged changes. Did you forget to \"git add\" your files?\n")
+		dief("no staged changes.\nDid you forget to 'git add'?")
 	}
 	if currentBranch() != "master" {
-		dief("You must run create from the master branch.\n" +
-			"(Try \"review sync\" or \"git checkout master\" first.)\n")
+		dief("must run 'create' from the master branch.\n" +
+			"(Try 'review sync' or 'git checkout master' first.)")
 	}
 	run("git", "checkout", "-q", "-b", name)
 	if err := runErr("git", "commit", "-q"); err != nil {
@@ -111,10 +111,10 @@
 
 func commit() {
 	if !hasStagedChanges() {
-		dief("No staged changes. Did you forget to \"git add\" your files?\n")
+		dief("no staged changes. Did you forget to 'git add'?")
 	}
 	if currentBranch() == "master" {
-		dief("Can't commit to master branch.\n")
+		dief("can't commit to master branch.")
 	}
 	run("git", "commit", "-q", "--amend", "-C", "HEAD")
 }
@@ -124,8 +124,9 @@
 }
 
 func upload() {
+	// TODO(adg): support flag to specify reviewer
 	if currentBranch() == "master" {
-		dief("Can't upload from master branch.\n")
+		dief("can't upload from master branch.")
 	}
 	run("git", "push", "-q", "origin", "HEAD:refs/for/master")
 }
@@ -227,27 +228,24 @@
 func originURL() string {
 	out, err := exec.Command("git", "config", "remote.origin.url").CombinedOutput()
 	if err != nil {
-		dief("Could not find URL for 'origin' remote.\n"+
+		dief("could not find URL for 'origin' remote.\n"+
 			"Did you check out from the right place?\n"+
-			"git config remote.origin.url output: %v\n"+
-			"%v\n", string(out), err)
+			"git config remote.origin.url: %v\n"+
+			"%s", err, out)
 	}
 	return string(out)
 }
 
 func localBranches() (branches []string) {
 	for _, s := range runLines("git", "branch", "-l", "-q") {
-		s = strings.TrimSpace(strings.TrimPrefix(s, "* "))
-		if s != "" {
-			branches = append(branches, s)
-		}
+		branches = append(branches, strings.TrimPrefix(s, "* "))
 	}
 	return branches
 }
 
 func branchContains(branch, rev string) bool {
 	for _, s := range runLines("git", "branch", "-r", "--contains", rev) {
-		if strings.TrimSpace(s) == branch {
+		if s == branch {
 			return true
 		}
 	}
@@ -272,7 +270,7 @@
 			return strings.TrimPrefix(s, p)
 		}
 	}
-	dief("Could not find current branch with 'git status'.\n")
+	dief("could not find current branch with 'git status'.")
 	panic("unreachable")
 }
 
@@ -282,8 +280,7 @@
 
 func headSubmitted(branch string) bool {
 	s := "Change-Id: " + headChangeId(branch)
-	args := []string{"log", "--grep", s, "origin/master"}
-	return len(runOutput("git", args...)) > 0
+	return len(runOutput("git", "log", "--grep", s, "origin/master")) > 0
 }
 
 func headChangeId(branch string) string {
@@ -296,28 +293,29 @@
 			return strings.TrimSpace(strings.TrimPrefix(s, p))
 		}
 	}
-	dief("No Change-Id line found in HEAD commit.\n")
+	dief("no Change-Id line found in HEAD commit on branch %s.", branch)
 	panic("unreachable")
 }
 
 func goToRepoRoot() {
 	prevDir, err := os.Getwd()
 	if err != nil {
-		dief("could not get current directory: %v\n", err)
+		dief("could not get current directory: %v", err)
 	}
 	for {
 		if _, err := os.Stat(".git"); err == nil {
 			return
 		}
 		if err := os.Chdir(".."); err != nil {
-			dief("could not chdir: %v\n", err)
+			dief("could not chdir: %v", err)
 		}
 		currentDir, err := os.Getwd()
 		if err != nil {
-			dief("could not get current directory: %v\n", err)
+			dief("could not get current directory: %v", err)
 		}
 		if currentDir == prevDir {
-			dief("Git root not found. Run from within the Git tree please.\n")
+			dief("git root not found.\n" +
+				"Run from within the Git tree please.")
 		}
 		prevDir = currentDir
 	}
@@ -329,18 +327,18 @@
 		return
 	}
 	if !os.IsNotExist(err) {
-		dief("checking for hook file: %v\n", err)
+		dief("error checking for hook file: %v", err)
 	}
 	verbosef("Presubmit hook to add Change-Id to commit messages is missing.\n"+
 		"Automatically creating it at %v.\n", hookFile)
 	hookContent := []byte(commitMsgHook)
 	if err := ioutil.WriteFile(hookFile, hookContent, 0700); err != nil {
-		dief("writing hook file: %v\n", err)
+		dief("error writing hook file: %v", err)
 	}
 }
 
 func dief(format string, args ...interface{}) {
-	fmt.Fprintf(os.Stderr, format, args...)
+	fmt.Fprintf(os.Stderr, "review: "+format+"\n", args...)
 	os.Exit(1)
 }
 
@@ -351,7 +349,7 @@
 			// before dying to give context to the failure.
 			fmt.Fprintln(os.Stderr, commandString(command, args))
 		}
-		dief("%v\n", err)
+		dief("%v", err)
 	}
 }
 
@@ -375,13 +373,21 @@
 func runOutput(command string, args ...string) string {
 	b, err := exec.Command(command, args...).CombinedOutput()
 	if err != nil {
-		dief("%v\n%s\nerror: %v\n", commandString(command, args), b, err)
+		fmt.Fprintf(os.Stderr, "%v\n%s\n", commandString(command, args), b)
+		dief("%v", err)
 	}
 	return string(b)
 }
 
 func runLines(command string, args ...string) []string {
-	return strings.Split(runOutput(command, args...), "\n")
+	var s []string
+	for _, l := range strings.Split(runOutput(command, args...), "\n") {
+		l = strings.TrimSpace(l)
+		if l != "" {
+			s = append(s, l)
+		}
+	}
+	return s
 }
 
 func commandString(command string, args []string) string {
