From 255a3c99e6666ed7fcaf3a1b20939451ba7c333a Mon Sep 17 00:00:00 2001
From: Kirill Smelkov <kirr@nexedi.com>
Date: Mon, 3 Jul 2017 10:47:52 +0300
Subject: [PATCH] .

---
 go/xcommon/tracing/cmd/gotrace/gotrace.go     | 20 ++++++++++++-------
 .../cmd/gotrace/testdata/src/a/pkg1/pkg1.go   |  5 ++++-
 .../cmd/gotrace/testdata/src/b/pkg2/pkg2.go   |  9 +++++----
 3 files changed, 22 insertions(+), 12 deletions(-)

diff --git a/go/xcommon/tracing/cmd/gotrace/gotrace.go b/go/xcommon/tracing/cmd/gotrace/gotrace.go
index 0f232aa6..fef9e729 100644
--- a/go/xcommon/tracing/cmd/gotrace/gotrace.go
+++ b/go/xcommon/tracing/cmd/gotrace/gotrace.go
@@ -201,7 +201,7 @@ func parseTraceEvent(prog *loader.Program, pkgi *loader.PackageInfo, srcfile *as
 }
 
 // packageTrace returns tracing information about a package
-func packageTrace(prog *loader.Program, pkgi *loader.PackageInfo) *Package {
+func packageTrace(prog *loader.Program, pkgi *loader.PackageInfo) (*Package, error) {
 	eventv  := []*traceEvent{}
 	importv := []*traceImport{}
 
@@ -223,7 +223,7 @@ func packageTrace(prog *loader.Program, pkgi *loader.PackageInfo) *Package {
 
 				textv := strings.SplitN(comment.Text, " ", 2)
 				if len(textv) != 2 {
-					log.Fatalf("%v: invalid directive format")
+					return nil, fmt.Errorf("%v: invalid directive format", pos)
 				}
 
 				directive, arg := textv[0], textv[1]
@@ -231,22 +231,28 @@ func packageTrace(prog *loader.Program, pkgi *loader.PackageInfo) *Package {
 				case "//trace:event":
 					event, err := parseTraceEvent(prog, pkgi, file, pos, arg)
 					if err != nil {
-						log.Fatal(err)
+						nil, err
 					}
 
 					eventv = append(eventv, event)
 
 				case "//trace:import":
+					// Unqote arg as in regular import
+					importPath, err := strconv.Unquote(arg)
+					if err != nil || arg[0] == `'` {
+						nil, fmt.Errorf("%v: invalid trace-import path %v", pos, arg)
+					}
+
 					// reject duplicate imports
 					for _, imported := range importv {
-						if arg == imported.PkgPath {
-							log.Fatalf("%v: duplicate trace import of %v (previous at %v)", pos, arg, imported.Pos)
+						if importPath == imported.PkgPath {
+							return nil, fmt.Errorf("%v: duplicate trace import of %v (previous at %v)", pos, importPath, imported.Pos)
 						}
 					}
-					importv = append(importv, &traceImport{Pos: pos, PkgPath: arg})
+					importv = append(importv, &traceImport{Pos: pos, PkgPath: importPath})
 
 				default:
-					log.Fatalf("%v: unknown tracing directive %q", pos, directive)
+					return nil, fmt.Errorf("%v: unknown tracing directive %q", pos, directive)
 				}
 			}
 		}
diff --git a/go/xcommon/tracing/cmd/gotrace/testdata/src/a/pkg1/pkg1.go b/go/xcommon/tracing/cmd/gotrace/testdata/src/a/pkg1/pkg1.go
index 936e4d8f..62cedf21 100644
--- a/go/xcommon/tracing/cmd/gotrace/testdata/src/a/pkg1/pkg1.go
+++ b/go/xcommon/tracing/cmd/gotrace/testdata/src/a/pkg1/pkg1.go
@@ -3,7 +3,7 @@ package pkg1
 import (
 	"net/url"
 
-	// extra import which is used in package but should not be used in tracing
+	// extra import which is used in package but should not be used in tracing code
 	"fmt"
 )
 
@@ -41,3 +41,6 @@ func ParseURL(ustr string) (*url.URL, error) {
 func DoSomething(topic string) {
 	traceDoSomething(topic)
 }
+
+
+// TODO package-local non-exported tracepoint
diff --git a/go/xcommon/tracing/cmd/gotrace/testdata/src/b/pkg2/pkg2.go b/go/xcommon/tracing/cmd/gotrace/testdata/src/b/pkg2/pkg2.go
index f5971cc7..aa045aa7 100644
--- a/go/xcommon/tracing/cmd/gotrace/testdata/src/b/pkg2/pkg2.go
+++ b/go/xcommon/tracing/cmd/gotrace/testdata/src/b/pkg2/pkg2.go
@@ -1,11 +1,12 @@
 package pkg2
 
-import "a/pkg1" // TODO should not be needed eventually
+// XXX vvv kill
+//import "a/pkg1" // TODO should not be needed eventually
 
-//trace:import a/pkg1
+//trace:import "a/pkg1"
 
-
-//trace:event DoSomething(i, j int, q string)
+// additional tracepoint which pkg2 defines
+//trace:event traceDoSomething(i, j int, q string)
 
 func DoSomething(i, j int, q string) {
 	traceDoSomething(i, j, q)
-- 
2.30.9