mirror of
https://code.forgejo.org/forgejo/runner.git
synced 2024-11-24 13:49:08 +03:00
73 lines
1.5 KiB
Go
73 lines
1.5 KiB
Go
|
// Copyright 2023 The Gitea Authors. All rights reserved.
|
||
|
// SPDX-License-Identifier: MIT
|
||
|
|
||
|
package artifactcache
|
||
|
|
||
|
import (
|
||
|
"fmt"
|
||
|
"net/http"
|
||
|
"strconv"
|
||
|
"strings"
|
||
|
"sync"
|
||
|
|
||
|
"github.com/go-chi/render"
|
||
|
"xorm.io/xorm"
|
||
|
)
|
||
|
|
||
|
func responseJson(w http.ResponseWriter, r *http.Request, code int, v ...any) {
|
||
|
render.Status(r, code)
|
||
|
if len(v) == 0 || v[0] == nil {
|
||
|
render.JSON(w, r, struct{}{})
|
||
|
} else if err, ok := v[0].(error); ok {
|
||
|
logger.Errorf("%v %v: %v", r.Method, r.RequestURI, err)
|
||
|
render.JSON(w, r, map[string]any{
|
||
|
"error": err.Error(),
|
||
|
})
|
||
|
} else {
|
||
|
render.JSON(w, r, v[0])
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func parseContentRange(s string) (int64, int64, error) {
|
||
|
// support the format like "bytes 11-22/*" only
|
||
|
s, _, _ = strings.Cut(strings.TrimPrefix(s, "bytes "), "/")
|
||
|
s1, s2, _ := strings.Cut(s, "-")
|
||
|
|
||
|
start, err := strconv.ParseInt(s1, 10, 64)
|
||
|
if err != nil {
|
||
|
return 0, 0, fmt.Errorf("parse %q: %w", s, err)
|
||
|
}
|
||
|
stop, err := strconv.ParseInt(s2, 10, 64)
|
||
|
if err != nil {
|
||
|
return 0, 0, fmt.Errorf("parse %q: %w", s, err)
|
||
|
}
|
||
|
return start, stop, nil
|
||
|
}
|
||
|
|
||
|
// engine is a wrapper of *xorm.Engine, with a lock.
|
||
|
// To avoid racing of sqlite, we don't careperformance here.
|
||
|
type engine struct {
|
||
|
e *xorm.Engine
|
||
|
m sync.Mutex
|
||
|
}
|
||
|
|
||
|
func (e *engine) Exec(f func(*xorm.Session) error) error {
|
||
|
e.m.Lock()
|
||
|
defer e.m.Unlock()
|
||
|
|
||
|
sess := e.e.NewSession()
|
||
|
defer sess.Close()
|
||
|
|
||
|
return f(sess)
|
||
|
}
|
||
|
|
||
|
func (e *engine) ExecBool(f func(*xorm.Session) (bool, error)) (bool, error) {
|
||
|
e.m.Lock()
|
||
|
defer e.m.Unlock()
|
||
|
|
||
|
sess := e.e.NewSession()
|
||
|
defer sess.Close()
|
||
|
|
||
|
return f(sess)
|
||
|
}
|