[common/errors] Correctly render regular Go errors implementing Unwrap.

Previously Unwrap was mostly implemented by LUCI errors... however the
stdlib adopted an identical interface (yay!) which ended up triggering
a bug in the error rendering logic. Specifically, the error rendering
logic buffers all wrappers until it encounters a LUCI stackframe
(stackContexter) in the error. Upon encountering a stackContexter, it
will then print all of the encountered wrappers in the context of that
stack frame.

However, this rendering logic failed to account for cases where the
error is either entirely an external error, or is an annotation of an
external error and would end up fully unwrapping an error, but then
discarding all of that wrapper information.

Now the rendering logic will keep a pointer to the last stackContexter
it actually encountered. Once it finishes unwrapping the error all the
way to the bottom, it will render the original error from the point in
the error tree where it last saw a stackContexter. This also means that
for pure Go errors (with no stack context at all), they will now be
rendered without the `original error:` preamble which is part of the
stack trace display.

R=vadimsh

Change-Id: Ifd005c52e8407c9ff90a9fe6b5dd320e56d7d831
Reviewed-on: https://chromium-review.googlesource.com/c/infra/luci/luci-go/+/4229612
Commit-Queue: Robbie Iannucci <iannucci@chromium.org>
Reviewed-by: Vadim Shtayura <vadimsh@chromium.org>
3 files changed
tree: d5b552ab65621324fb5f737e65359cc003ac50f5
  1. analysis/
  2. appengine/
  3. auth/
  4. auth_service/
  5. bisection/
  6. build/
  7. buildbucket/
  8. casviewer/
  9. cipd/
  10. client/
  11. cmdrunner/
  12. common/
  13. config/
  14. cv/
  15. deploy/
  16. examples/
  17. gae/
  18. gce/
  19. grpc/
  20. hardcoded/
  21. led/
  22. logdog/
  23. luci_notify/
  24. lucicfg/
  25. lucictx/
  26. luciexe/
  27. mailer/
  28. milo/
  29. mmutex/
  30. provenance/
  31. resultdb/
  32. scheduler/
  33. scripts/
  34. server/
  35. standalone/
  36. starlark/
  37. swarming/
  38. third_party/
  39. tokenserver/
  40. tools/
  41. vpython/
  42. web/
  43. .gitallowed
  44. .gitattributes
  45. .golangci.yml
  46. AUTHORS
  47. codereview.settings
  48. CONTRIBUTING.md
  49. CONTRIBUTORS
  50. go.mod
  51. go.sum
  52. LICENSE
  53. OWNERS
  54. PRESUBMIT.py
  55. README.md
  56. tools.go
  57. WATCHLISTS
README.md

luci-go: LUCI services and tools in Go

GoReference

Installing

LUCI Go code is meant to be worked on from an Chromium infra.git checkout, which enforces packages versions and Go toolchain version. First get fetch via depot_tools.git then run:

fetch infra
cd infra/go
eval `./env.py`
cd src/go.chromium.org/luci

It is now possible to directly install tools with go install:

go install go.chromium.org/luci/auth/client/cmd/...@latest
go install go.chromium.org/luci/buildbucket/cmd/...@latest
go install go.chromium.org/luci/cipd/client/cmd/...@latest
go install go.chromium.org/luci/client/cmd/...@latest
go install go.chromium.org/luci/cv/cmd/...@latest
go install go.chromium.org/luci/gce/cmd/...@latest
go install go.chromium.org/luci/grpc/cmd/...@latest
go install go.chromium.org/luci/logdog/client/cmd/...@latest
go install go.chromium.org/luci/luci_notify/cmd/...@latest
go install go.chromium.org/luci/lucicfg/cmd/...@latest
go install go.chromium.org/luci/luciexe/legacy/cmd/...@latest
go install go.chromium.org/luci/mailer/cmd/...@latest
go install go.chromium.org/luci/mmutex/cmd/...@latest
go install go.chromium.org/luci/resultdb/cmd/...@latest
go install go.chromium.org/luci/server/cmd/...@latest
go install go.chromium.org/luci/swarming/cmd/...@latest
go install go.chromium.org/luci/tokenserver/cmd/...@latest
go install go.chromium.org/luci/tools/cmd/...@latest

Contributing

Contributing uses the same flow as Chromium contributions.