From 9e48ab1d90cd1149871596a85c24cc0c6376e013 Mon Sep 17 00:00:00 2001 From: Michael Matloob Date: Fri, 12 Jul 2019 17:14:28 -0400 Subject: [PATCH] go/loader: normalize cycle to remove flake Fixes golang/go#31279 Change-Id: Idd1eead3b1e9a90ba39d04019ef32200deb4c983 Reviewed-on: https://go-review.googlesource.com/c/tools/+/185984 Run-TryBot: Michael Matloob Reviewed-by: Ian Cottrell --- go/loader/loader.go | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/go/loader/loader.go b/go/loader/loader.go index de34b809..bc12ca33 100644 --- a/go/loader/loader.go +++ b/go/loader/loader.go @@ -811,7 +811,15 @@ func (imp *importer) doImport(from *PackageInfo, to string) (*types.Package, err // Import of incomplete package: this indicates a cycle. fromPath := from.Pkg.Path() if cycle := imp.findPath(path, fromPath); cycle != nil { - cycle = append([]string{fromPath}, cycle...) + // Normalize cycle: start from alphabetically largest node. + pos, start := -1, "" + for i, s := range cycle { + if pos < 0 || s > start { + pos, start = i, s + } + } + cycle = append(cycle, cycle[:pos]...)[pos:] // rotate cycle to start from largest + cycle = append(cycle, cycle[0]) // add start node to end to show cycliness return nil, fmt.Errorf("import cycle: %s", strings.Join(cycle, " -> ")) }