Compare commits
6 Commits
Author | SHA1 | Date | |
---|---|---|---|
08681756b6
|
|||
64772d0474 | |||
127764556e | |||
170f43d806 | |||
9dffc41274
|
|||
c63cf442f8
|
6
Makefile
6
Makefile
@@ -7,5 +7,11 @@ test:
|
|||||||
which gotestsum || go install gotest.tools/gotestsum@latest
|
which gotestsum || go install gotest.tools/gotestsum@latest
|
||||||
gotestsum --format "testname" -- -tags="timetzdata sqlite_fts5 sqlite_foreign_keys" "./..."
|
gotestsum --format "testname" -- -tags="timetzdata sqlite_fts5 sqlite_foreign_keys" "./..."
|
||||||
|
|
||||||
|
test-in-docker:
|
||||||
|
tag="goext_temp_test_image:$(shell uuidgen | tr -d '-')"; \
|
||||||
|
docker build --tag $$tag . -f .gitea/workflows/Dockerfile_tests; \
|
||||||
|
docker run --rm $$tag; \
|
||||||
|
docker rmi $$tag
|
||||||
|
|
||||||
version:
|
version:
|
||||||
_data/version.sh
|
_data/version.sh
|
@@ -133,9 +133,6 @@ func run(opt CommandRunner) (CommandResult, error) {
|
|||||||
|
|
||||||
case <-stderrFailChan:
|
case <-stderrFailChan:
|
||||||
_ = cmd.Process.Kill()
|
_ = cmd.Process.Kill()
|
||||||
for _, lstr := range opt.listener {
|
|
||||||
lstr.Timeout()
|
|
||||||
}
|
|
||||||
|
|
||||||
if fallback, ok := syncext.ReadChannelWithTimeout(outputChan, 32*time.Millisecond); ok {
|
if fallback, ok := syncext.ReadChannelWithTimeout(outputChan, 32*time.Millisecond); ok {
|
||||||
// most of the time the cmd.Process.Kill() should also have finished the pipereader
|
// most of the time the cmd.Process.Kill() should also have finished the pipereader
|
||||||
@@ -160,7 +157,8 @@ func run(opt CommandRunner) (CommandResult, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
case outobj := <-outputChan:
|
case outobj := <-outputChan:
|
||||||
if exiterr, ok := outobj.err.(*exec.ExitError); ok {
|
var exiterr *exec.ExitError
|
||||||
|
if errors.As(outobj.err, &exiterr) {
|
||||||
excode := exiterr.ExitCode()
|
excode := exiterr.ExitCode()
|
||||||
for _, lstr := range opt.listener {
|
for _, lstr := range opt.listener {
|
||||||
lstr.Finished(excode)
|
lstr.Finished(excode)
|
||||||
|
@@ -32,8 +32,8 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string,
|
|||||||
stdout := ""
|
stdout := ""
|
||||||
go func() {
|
go func() {
|
||||||
buf := make([]byte, 128)
|
buf := make([]byte, 128)
|
||||||
for true {
|
for {
|
||||||
n, out := pr.stdout.Read(buf)
|
n, err := pr.stdout.Read(buf)
|
||||||
if n > 0 {
|
if n > 0 {
|
||||||
txt := string(buf[:n])
|
txt := string(buf[:n])
|
||||||
stdout += txt
|
stdout += txt
|
||||||
@@ -42,11 +42,11 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string,
|
|||||||
lstr.ReadRawStdout(buf[:n])
|
lstr.ReadRawStdout(buf[:n])
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if out == io.EOF {
|
if err == io.EOF {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
if out != nil {
|
if err != nil {
|
||||||
errch <- out
|
errch <- err
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -61,7 +61,7 @@ func (pr *pipeReader) Read(listener []CommandListener) (string, string, string,
|
|||||||
stderr := ""
|
stderr := ""
|
||||||
go func() {
|
go func() {
|
||||||
buf := make([]byte, 128)
|
buf := make([]byte, 128)
|
||||||
for true {
|
for {
|
||||||
n, err := pr.stderr.Read(buf)
|
n, err := pr.stderr.Read(buf)
|
||||||
|
|
||||||
if n > 0 {
|
if n > 0 {
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
package goext
|
package goext
|
||||||
|
|
||||||
const GoextVersion = "0.0.270"
|
const GoextVersion = "0.0.273"
|
||||||
|
|
||||||
const GoextVersionTimestamp = "2023-09-25T11:35:03+0200"
|
const GoextVersionTimestamp = "2023-09-27T14:15:59+0200"
|
||||||
|
@@ -1,7 +1,10 @@
|
|||||||
package langext
|
package langext
|
||||||
|
|
||||||
|
import "runtime/debug"
|
||||||
|
|
||||||
type PanicWrappedErr struct {
|
type PanicWrappedErr struct {
|
||||||
panic any
|
panic any
|
||||||
|
Stack string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (p PanicWrappedErr) Error() string {
|
func (p PanicWrappedErr) Error() string {
|
||||||
@@ -15,7 +18,7 @@ func (p PanicWrappedErr) ReoveredObj() any {
|
|||||||
func RunPanicSafe(fn func()) (err error) {
|
func RunPanicSafe(fn func()) (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if rec := recover(); rec != nil {
|
if rec := recover(); rec != nil {
|
||||||
err = PanicWrappedErr{panic: rec}
|
err = PanicWrappedErr{panic: rec, Stack: string(debug.Stack())}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@@ -27,7 +30,7 @@ func RunPanicSafe(fn func()) (err error) {
|
|||||||
func RunPanicSafeR1(fn func() error) (err error) {
|
func RunPanicSafeR1(fn func() error) (err error) {
|
||||||
defer func() {
|
defer func() {
|
||||||
if rec := recover(); rec != nil {
|
if rec := recover(); rec != nil {
|
||||||
err = PanicWrappedErr{panic: rec}
|
err = PanicWrappedErr{panic: rec, Stack: string(debug.Stack())}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@@ -38,7 +41,7 @@ func RunPanicSafeR2[T1 any](fn func() (T1, error)) (r1 T1, err error) {
|
|||||||
defer func() {
|
defer func() {
|
||||||
if rec := recover(); rec != nil {
|
if rec := recover(); rec != nil {
|
||||||
r1 = *new(T1)
|
r1 = *new(T1)
|
||||||
err = PanicWrappedErr{panic: rec}
|
err = PanicWrappedErr{panic: rec, Stack: string(debug.Stack())}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@@ -50,7 +53,7 @@ func RunPanicSafeR3[T1 any, T2 any](fn func() (T1, T2, error)) (r1 T1, r2 T2, er
|
|||||||
if rec := recover(); rec != nil {
|
if rec := recover(); rec != nil {
|
||||||
r1 = *new(T1)
|
r1 = *new(T1)
|
||||||
r2 = *new(T2)
|
r2 = *new(T2)
|
||||||
err = PanicWrappedErr{panic: rec}
|
err = PanicWrappedErr{panic: rec, Stack: string(debug.Stack())}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
@@ -63,7 +66,7 @@ func RunPanicSafeR4[T1 any, T2 any, T3 any](fn func() (T1, T2, T3, error)) (r1 T
|
|||||||
r1 = *new(T1)
|
r1 = *new(T1)
|
||||||
r2 = *new(T2)
|
r2 = *new(T2)
|
||||||
r3 = *new(T3)
|
r3 = *new(T3)
|
||||||
err = PanicWrappedErr{panic: rec}
|
err = PanicWrappedErr{panic: rec, Stack: string(debug.Stack())}
|
||||||
}
|
}
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
@@ -27,10 +27,12 @@ func (a *AtomicBool) Get() bool {
|
|||||||
return a.v
|
return a.v
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AtomicBool) Set(value bool) {
|
func (a *AtomicBool) Set(value bool) bool {
|
||||||
a.lock.Lock()
|
a.lock.Lock()
|
||||||
defer a.lock.Unlock()
|
defer a.lock.Unlock()
|
||||||
|
|
||||||
|
oldValue := a.v
|
||||||
|
|
||||||
a.v = value
|
a.v = value
|
||||||
|
|
||||||
for k, v := range a.listener {
|
for k, v := range a.listener {
|
||||||
@@ -42,6 +44,8 @@ func (a *AtomicBool) Set(value bool) {
|
|||||||
delete(a.listener, k)
|
delete(a.listener, k)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return oldValue
|
||||||
}
|
}
|
||||||
|
|
||||||
func (a *AtomicBool) Wait(waitFor bool) {
|
func (a *AtomicBool) Wait(waitFor bool) {
|
||||||
|
@@ -73,7 +73,7 @@ func (c *Coll[TData]) ReplaceOne(ctx context.Context, filterQuery bson.M, value
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (c *Coll[TData]) FindOneAndReplace(ctx context.Context, filterQuery bson.M, value TData) (TData, error) {
|
func (c *Coll[TData]) FindOneAndReplace(ctx context.Context, filterQuery bson.M, value TData) (TData, error) {
|
||||||
mongoRes := c.coll.FindOneAndUpdate(ctx, filterQuery, bson.M{"$set": value}, options.FindOneAndUpdate().SetReturnDocument(options.After))
|
mongoRes := c.coll.FindOneAndReplace(ctx, filterQuery, value, options.FindOneAndReplace().SetReturnDocument(options.After))
|
||||||
if err := mongoRes.Err(); err != nil {
|
if err := mongoRes.Err(); err != nil {
|
||||||
return *new(TData), exerr.Wrap(err, "mongo-query[find-one-and-update] failed").
|
return *new(TData), exerr.Wrap(err, "mongo-query[find-one-and-update] failed").
|
||||||
Str("collection", c.Name()).
|
Str("collection", c.Name()).
|
||||||
|
Reference in New Issue
Block a user