forked from vikunja/vikunja
konrad
d02d413c5e
Use sentry echo integration to send errors Only capture errors not already handled by echo Add sentry panic handler Add sentry library Add sentry init Add sentry config Co-authored-by: kolaente <k@knt.li> Reviewed-on: vikunja/api#591
70 lines
1.2 KiB
Go
70 lines
1.2 KiB
Go
package sentry
|
|
|
|
import (
|
|
"bytes"
|
|
"io/ioutil"
|
|
"sync"
|
|
)
|
|
|
|
type sourceReader struct {
|
|
mu sync.Mutex
|
|
cache map[string][][]byte
|
|
}
|
|
|
|
func newSourceReader() sourceReader {
|
|
return sourceReader{
|
|
cache: make(map[string][][]byte),
|
|
}
|
|
}
|
|
|
|
func (sr *sourceReader) readContextLines(filename string, line, context int) ([][]byte, int) {
|
|
sr.mu.Lock()
|
|
defer sr.mu.Unlock()
|
|
|
|
lines, ok := sr.cache[filename]
|
|
|
|
if !ok {
|
|
data, err := ioutil.ReadFile(filename)
|
|
if err != nil {
|
|
sr.cache[filename] = nil
|
|
return nil, 0
|
|
}
|
|
lines = bytes.Split(data, []byte{'\n'})
|
|
sr.cache[filename] = lines
|
|
}
|
|
|
|
return sr.calculateContextLines(lines, line, context)
|
|
}
|
|
|
|
// `contextLine` points to a line that caused an issue itself, in relation to returned slice
|
|
func (sr *sourceReader) calculateContextLines(lines [][]byte, line, context int) ([][]byte, int) {
|
|
// Stacktrace lines are 1-indexed, slices are 0-indexed
|
|
line--
|
|
|
|
contextLine := context
|
|
|
|
if lines == nil || line >= len(lines) || line < 0 {
|
|
return nil, 0
|
|
}
|
|
|
|
if context < 0 {
|
|
context = 0
|
|
contextLine = 0
|
|
}
|
|
|
|
start := line - context
|
|
|
|
if start < 0 {
|
|
contextLine += start
|
|
start = 0
|
|
}
|
|
|
|
end := line + context + 1
|
|
|
|
if end > len(lines) {
|
|
end = len(lines)
|
|
}
|
|
|
|
return lines[start:end], contextLine
|
|
}
|