|
|
|
module code.gitea.io/gitea
|
|
|
|
|
|
|
|
go 1.23
|
|
|
|
|
|
|
|
// rfc5280 said: "The serial number is an integer assigned by the CA to each certificate."
|
|
|
|
// But some CAs use negative serial number, just relax the check. related:
|
|
|
|
// Default TLS cert uses negative serial number #895 https://github.com/microsoft/mssql-docker/issues/895
|
|
|
|
godebug x509negativeserial=1
|
|
|
|
|
|
|
|
require (
|
|
|
|
code.gitea.io/actions-proto-go v0.4.0
|
|
|
|
code.gitea.io/gitea-vet v0.2.3
|
|
|
|
code.gitea.io/sdk/gitea v0.19.0
|
|
|
|
codeberg.org/gusted/mcaptcha v0.0.0-20220723083913-4f3072e1d570
|
|
|
|
connectrpc.com/connect v1.17.0
|
|
|
|
gitea.com/go-chi/binding v0.0.0-20240430071103-39a851e106ed
|
|
|
|
gitea.com/go-chi/cache v0.2.1
|
|
|
|
gitea.com/go-chi/captcha v0.0.0-20240315150714-fb487f629098
|
|
|
|
gitea.com/go-chi/session v0.0.0-20240316035857-16768d98ec96
|
|
|
|
gitea.com/lunny/dingtalk_webhook v0.0.0-20171025031554-e3534c89ef96
|
|
|
|
gitea.com/lunny/levelqueue v0.4.2-0.20230414023320-3c0159fe0fe4
|
|
|
|
github.com/42wim/httpsig v1.2.2
|
|
|
|
github.com/42wim/sshsig v0.0.0-20240818000253-e3a6333df815
|
|
|
|
github.com/Azure/azure-sdk-for-go/sdk/azcore v1.16.0
|
|
|
|
github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.4.1
|
|
|
|
github.com/Azure/go-ntlmssp v0.0.0-20221128193559-754e69321358
|
|
|
|
github.com/ProtonMail/go-crypto v1.0.0
|
|
|
|
github.com/PuerkitoBio/goquery v1.10.0
|
|
|
|
github.com/SaveTheRbtz/zstd-seekable-format-go/pkg v0.7.3
|
|
|
|
github.com/alecthomas/chroma/v2 v2.14.0
|
|
|
|
github.com/aws/aws-sdk-go v1.55.5
|
|
|
|
github.com/aws/aws-sdk-go-v2/credentials v1.17.42
|
|
|
|
github.com/aws/aws-sdk-go-v2/service/codecommit v1.27.3
|
|
|
|
github.com/blakesmith/ar v0.0.0-20190502131153-809d4375e1fb
|
|
|
|
github.com/blevesearch/bleve/v2 v2.4.2
|
|
|
|
github.com/buildkite/terminal-to-html/v3 v3.16.3
|
|
|
|
github.com/caddyserver/certmagic v0.21.4
|
|
|
|
github.com/charmbracelet/git-lfs-transfer v0.2.0
|
|
|
|
github.com/chi-middleware/proxy v1.1.1
|
|
|
|
github.com/dimiro1/reply v0.0.0-20200315094148-d0136a4c9e21
|
|
|
|
github.com/djherbis/buffer v1.2.0
|
|
|
|
github.com/djherbis/nio/v3 v3.0.1
|
|
|
|
github.com/dsnet/compress v0.0.2-0.20210315054119-f66993602bf5
|
|
|
|
github.com/dustin/go-humanize v1.0.1
|
|
|
|
github.com/editorconfig/editorconfig-core-go/v2 v2.6.2
|
|
|
|
github.com/emersion/go-imap v1.2.1
|
|
|
|
github.com/emirpasic/gods v1.18.1
|
|
|
|
github.com/ethantkoenig/rupture v1.0.1
|
|
|
|
github.com/felixge/fgprof v0.9.5
|
|
|
|
github.com/fsnotify/fsnotify v1.7.0
|
|
|
|
github.com/gliderlabs/ssh v0.3.7
|
|
|
|
github.com/go-ap/activitypub v0.0.0-20240910141749-b4b8c8aa484c
|
|
|
|
github.com/go-ap/jsonld v0.0.0-20221030091449-f2a191312c73
|
|
|
|
github.com/go-chi/chi/v5 v5.1.0
|
|
|
|
github.com/go-chi/cors v1.2.1
|
|
|
|
github.com/go-co-op/gocron v1.37.0
|
|
|
|
github.com/go-enry/go-enry/v2 v2.9.1
|
|
|
|
github.com/go-git/go-billy/v5 v5.6.0
|
|
|
|
github.com/go-git/go-git/v5 v5.12.0
|
|
|
|
github.com/go-ldap/ldap/v3 v3.4.8
|
Introduce globallock as distributed locks (#31908)
To help #31813, but do not replace it, since this PR just introduces the
new module but misses some work:
- New option in settings. `#31813` has done it.
- Use the locks in business logic. `#31813` has done it.
So I think the most efficient way is to merge this PR first (if it's
acceptable) and then finish #31813.
## Design principles
### Use spinlock even in memory implementation
In actual use cases, users may cancel requests. `sync.Mutex` will block
the goroutine until the lock is acquired even if the request is
canceled. And the spinlock is more suitable for this scenario since it's
possible to give up the lock acquisition.
Although the spinlock consumes more CPU resources, I think it's
acceptable in most cases.
### Do not expose the mutex to callers
If we expose the mutex to callers, it's possible for callers to reuse
the mutex, which causes more complexity.
For example:
```go
lock := GetLocker(key)
lock.Lock()
// ...
// even if the lock is unlocked, we cannot GC the lock,
// since the caller may still use it again.
lock.Unlock()
lock.Lock()
// ...
lock.Unlock()
// callers have to GC the lock manually.
RemoveLocker(key)
```
That's why
https://github.com/go-gitea/gitea/pull/31813#discussion_r1721200549
In this PR, we only expose `ReleaseFunc` to callers. So callers just
need to call `ReleaseFunc` to release the lock, and do not need to care
about the lock's lifecycle.
```go
_, release, err := locker.Lock(ctx, key)
if err != nil {
return err
}
// ...
release()
// if callers want to lock again, they have to re-acquire the lock.
_, release, err := locker.Lock(ctx, key)
// ...
```
In this way, it's also much easier for redis implementation to extend
the mutex automatically, so that callers do not need to care about the
lock's lifecycle. See also
https://github.com/go-gitea/gitea/pull/31813#discussion_r1722659743
### Use "release" instead of "unlock"
For "unlock", it has the meaning of "unlock an acquired lock". So it's
not acceptable to call "unlock" when failed to acquire the lock, or call
"unlock" multiple times. It causes more complexity for callers to decide
whether to call "unlock" or not.
So we use "release" instead of "unlock" to make it clear. Whether the
lock is acquired or not, callers can always call "release", and it's
also safe to call "release" multiple times.
But the code DO NOT expect callers to not call "release" after acquiring
the lock. If callers forget to call "release", it will cause resource
leak. That's why it's always safe to call "release" without extra
checks: to avoid callers to forget to call it.
### Acquired locks could be lost
Unlike `sync.Mutex` which will be locked forever once acquired until
calling `Unlock`, in the new module, the acquired lock could be lost.
For example, the caller has acquired the lock, and it holds the lock for
a long time since auto-extending is working for redis. However, it lost
the connection to the redis server, and it's impossible to extend the
lock anymore.
If the caller don't stop what it's doing, another instance which can
connect to the redis server could acquire the lock, and do the same
thing, which could cause data inconsistency.
So the caller should know what happened, the solution is to return a new
context which will be canceled if the lock is lost or released:
```go
ctx, release, err := locker.Lock(ctx, key)
if err != nil {
return err
}
defer release()
// ...
DoSomething(ctx)
// the lock is lost now, then ctx has been canceled.
// Failed, since ctx has been canceled.
DoSomethingElse(ctx)
```
### Multiple ways to use the lock
1. Regular way
```go
ctx, release, err := Lock(ctx, key)
if err != nil {
return err
}
defer release()
// ...
```
2. Early release
```go
ctx, release, err := Lock(ctx, key)
if err != nil {
return err
}
defer release()
// ...
// release the lock earlier and reset the context back
ctx = release()
// continue to do something else
// ...
```
3. Functional way
```go
if err := LockAndDo(ctx, key, func(ctx context.Context) error {
// ...
return nil
}); err != nil {
return err
}
```
3 months ago
|
|
|
github.com/go-redsync/redsync/v4 v4.13.0
|
|
|
|
github.com/go-sql-driver/mysql v1.8.1
|
|
|
|
github.com/go-swagger/go-swagger v0.31.0
|
|
|
|
github.com/go-testfixtures/testfixtures/v3 v3.11.0
|
|
|
|
github.com/go-webauthn/webauthn v0.11.2
|
|
|
|
github.com/gobwas/glob v0.2.3
|
|
|
|
github.com/gogs/chardet v0.0.0-20211120154057-b7413eaefb8f
|
|
|
|
github.com/gogs/go-gogs-client v0.0.0-20210131175652-1d7215cd8d85
|
|
|
|
github.com/golang-jwt/jwt/v5 v5.2.1
|
|
|
|
github.com/google/go-github/v61 v61.0.0
|
|
|
|
github.com/google/licenseclassifier/v2 v2.0.0
|
|
|
|
github.com/google/pprof v0.0.0-20241029153458-d1b30febd7db
|
|
|
|
github.com/google/uuid v1.6.0
|
|
|
|
github.com/gorilla/feeds v1.2.0
|
|
|
|
github.com/gorilla/sessions v1.4.0
|
|
|
|
github.com/h2non/gock v1.2.0
|
|
|
|
github.com/hashicorp/go-version v1.7.0
|
|
|
|
github.com/hashicorp/golang-lru/v2 v2.0.7
|
|
|
|
github.com/huandu/xstrings v1.5.0
|
|
|
|
github.com/jaytaylor/html2text v0.0.0-20230321000545-74c2419ad056
|
|
|
|
github.com/jhillyerd/enmime v1.3.0
|
|
|
|
github.com/json-iterator/go v1.1.12
|
|
|
|
github.com/kballard/go-shellquote v0.0.0-20180428030007-95032a82bc51
|
|
|
|
github.com/keybase/go-crypto v0.0.0-20200123153347-de78d2cb44f4
|
|
|
|
github.com/klauspost/compress v1.17.11
|
|
|
|
github.com/klauspost/cpuid/v2 v2.2.8
|
|
|
|
github.com/lib/pq v1.10.9
|
|
|
|
github.com/markbates/goth v1.80.0
|
|
|
|
github.com/mattn/go-isatty v0.0.20
|
|
|
|
github.com/mattn/go-sqlite3 v1.14.24
|
|
|
|
github.com/meilisearch/meilisearch-go v0.29.0
|
|
|
|
github.com/mholt/archiver/v3 v3.5.1
|
|
|
|
github.com/microcosm-cc/bluemonday v1.0.27
|
|
|
|
github.com/microsoft/go-mssqldb v1.7.2
|
|
|
|
github.com/minio/minio-go/v7 v7.0.80
|
|
|
|
github.com/msteinert/pam v1.2.0
|
|
|
|
github.com/nektos/act v0.2.63
|
|
|
|
github.com/niklasfasching/go-org v1.7.0
|
|
|
|
github.com/olivere/elastic/v7 v7.0.32
|
|
|
|
github.com/opencontainers/go-digest v1.0.0
|
|
|
|
github.com/opencontainers/image-spec v1.1.0
|
|
|
|
github.com/pkg/errors v0.9.1
|
|
|
|
github.com/pquerna/otp v1.4.0
|
|
|
|
github.com/prometheus/client_golang v1.20.5
|
|
|
|
github.com/quasoft/websspi v1.1.2
|
|
|
|
github.com/redis/go-redis/v9 v9.7.0
|
|
|
|
github.com/robfig/cron/v3 v3.0.1
|
|
|
|
github.com/santhosh-tekuri/jsonschema/v5 v5.3.1
|
|
|
|
github.com/sassoftware/go-rpmutils v0.4.0
|
|
|
|
github.com/sergi/go-diff v1.3.2-0.20230802210424-5b0b94c5c0d3
|
|
|
|
github.com/shurcooL/vfsgen v0.0.0-20230704071429-0000e147ea92
|
|
|
|
github.com/stretchr/testify v1.9.0
|
|
|
|
github.com/syndtr/goleveldb v1.0.0
|
|
|
|
github.com/tstranex/u2f v1.0.0
|
|
|
|
github.com/ulikunitz/xz v0.5.12
|
|
|
|
github.com/urfave/cli/v2 v2.27.5
|
|
|
|
github.com/xanzy/go-gitlab v0.112.0
|
|
|
|
github.com/xeipuuv/gojsonschema v1.2.0
|
|
|
|
github.com/yohcop/openid-go v1.0.1
|
|
|
|
github.com/yuin/goldmark v1.7.8
|
|
|
|
github.com/yuin/goldmark-highlighting/v2 v2.0.0-20230729083705-37449abec8cc
|
|
|
|
github.com/yuin/goldmark-meta v1.1.0
|
|
|
|
golang.org/x/crypto v0.28.0
|
|
|
|
golang.org/x/image v0.21.0
|
|
|
|
golang.org/x/net v0.30.0
|
|
|
|
golang.org/x/oauth2 v0.23.0
|
|
|
|
golang.org/x/sys v0.26.0
|
|
|
|
golang.org/x/text v0.19.0
|
|
|
|
golang.org/x/tools v0.26.0
|
|
|
|
google.golang.org/grpc v1.67.1
|
|
|
|
google.golang.org/protobuf v1.35.1
|
|
|
|
gopkg.in/gomail.v2 v2.0.0-20160411212932-81ebce5c23df
|
|
|
|
gopkg.in/ini.v1 v1.67.0
|
|
|
|
gopkg.in/yaml.v3 v3.0.1
|
|
|
|
mvdan.cc/xurls/v2 v2.5.0
|
|
|
|
strk.kbt.io/projects/go/libravatar v0.0.0-20191008002943-06d1c002b251
|
|
|
|
xorm.io/builder v0.3.13
|
|
|
|
xorm.io/xorm v1.3.9
|
|
|
|
)
|
|
|
|
|
|
|
|
require (
|
|
|
|
cloud.google.com/go/compute/metadata v0.5.2 // indirect
|
|
|
|
dario.cat/mergo v1.0.1 // indirect
|
|
|
|
filippo.io/edwards25519 v1.1.0 // indirect
|
|
|
|
git.sr.ht/~mariusor/go-xsd-duration v0.0.0-20220703122237-02e73435a078 // indirect
|
|
|
|
github.com/Azure/azure-sdk-for-go/sdk/internal v1.10.0 // indirect
|
|
|
|
github.com/ClickHouse/ch-go v0.63.1 // indirect
|
|
|
|
github.com/ClickHouse/clickhouse-go/v2 v2.24.0 // indirect
|
|
|
|
github.com/DataDog/zstd v1.5.6 // indirect
|
|
|
|
github.com/Masterminds/goutils v1.1.1 // indirect
|
|
|
|
github.com/Masterminds/semver/v3 v3.3.0 // indirect
|
|
|
|
github.com/Masterminds/sprig/v3 v3.3.0 // indirect
|
|
|
|
github.com/Microsoft/go-winio v0.6.2 // indirect
|
|
|
|
github.com/RoaringBitmap/roaring v1.9.4 // indirect
|
|
|
|
github.com/andybalholm/brotli v1.1.1 // indirect
|
|
|
|
github.com/andybalholm/cascadia v1.3.2 // indirect
|
|
|
|
github.com/anmitsu/go-shlex v0.0.0-20200514113438-38f4b401e2be // indirect
|
|
|
|
github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect
|
|
|
|
github.com/aws/aws-sdk-go-v2 v1.32.3 // indirect
|
|
|
|
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.22 // indirect
|
|
|
|
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.22 // indirect
|
|
|
|
github.com/aws/smithy-go v1.22.0 // indirect
|
|
|
|
github.com/aymerick/douceur v0.2.0 // indirect
|
|
|
|
github.com/beorn7/perks v1.0.1 // indirect
|
|
|
|
github.com/bits-and-blooms/bitset v1.14.3 // indirect
|
|
|
|
github.com/blevesearch/bleve_index_api v1.1.12 // indirect
|
|
|
|
github.com/blevesearch/geo v0.1.20 // indirect
|
|
|
|
github.com/blevesearch/go-faiss v1.0.23 // indirect
|
|
|
|
github.com/blevesearch/go-porterstemmer v1.0.3 // indirect
|
|
|
|
github.com/blevesearch/gtreap v0.1.1 // indirect
|
|
|
|
github.com/blevesearch/mmap-go v1.0.4 // indirect
|
|
|
|
github.com/blevesearch/scorch_segment_api/v2 v2.2.16 // indirect
|
|
|
|
github.com/blevesearch/segment v0.9.1 // indirect
|
|
|
|
github.com/blevesearch/snowballstem v0.9.0 // indirect
|
|
|
|
github.com/blevesearch/upsidedown_store_api v1.0.2 // indirect
|
|
|
|
github.com/blevesearch/vellum v1.0.10 // indirect
|
|
|
|
github.com/blevesearch/zapx/v11 v11.3.10 // indirect
|
|
|
|
github.com/blevesearch/zapx/v12 v12.3.10 // indirect
|
|
|
|
github.com/blevesearch/zapx/v13 v13.3.10 // indirect
|
|
|
|
github.com/blevesearch/zapx/v14 v14.3.10 // indirect
|
|
|
|
github.com/blevesearch/zapx/v15 v15.3.16 // indirect
|
|
|
|
github.com/blevesearch/zapx/v16 v16.1.7 // indirect
|
|
|
|
github.com/boombuler/barcode v1.0.2 // indirect
|
|
|
|
github.com/bradfitz/gomemcache v0.0.0-20230905024940-24af94b03874 // indirect
|
|
|
|
github.com/caddyserver/zerossl v0.1.3 // indirect
|
|
|
|
github.com/cention-sany/utf7 v0.0.0-20170124080048-26cad61bd60a // indirect
|
|
|
|
github.com/cespare/xxhash/v2 v2.3.0 // indirect
|
|
|
|
github.com/cloudflare/circl v1.5.0 // indirect
|
|
|
|
github.com/couchbase/go-couchbase v0.1.1 // indirect
|
|
|
|
github.com/couchbase/gomemcached v0.3.2 // indirect
|
|
|
|
github.com/couchbase/goutils v0.1.2 // indirect
|
|
|
|
github.com/cpuguy83/go-md2man/v2 v2.0.5 // indirect
|
|
|
|
github.com/cyphar/filepath-securejoin v0.3.4 // indirect
|
|
|
|
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect
|
|
|
|
github.com/davidmz/go-pageant v1.0.2 // indirect
|
|
|
|
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
|
|
|
|
github.com/dlclark/regexp2 v1.11.4 // indirect
|
|
|
|
github.com/emersion/go-sasl v0.0.0-20241020182733-b788ff22d5a6 // indirect
|
|
|
|
github.com/fatih/color v1.18.0 // indirect
|
|
|
|
github.com/felixge/httpsnoop v1.0.4 // indirect
|
|
|
|
github.com/fxamacker/cbor/v2 v2.7.0 // indirect
|
|
|
|
github.com/git-lfs/pktline v0.0.0-20230103162542-ca444d533ef1 // indirect
|
|
|
|
github.com/go-ap/errors v0.0.0-20240910140019-1e9d33cc1568 // indirect
|
|
|
|
github.com/go-asn1-ber/asn1-ber v1.5.7 // indirect
|
|
|
|
github.com/go-enry/go-oniguruma v1.2.1 // indirect
|
|
|
|
github.com/go-faster/city v1.0.1 // indirect
|
|
|
|
github.com/go-faster/errors v0.7.1 // indirect
|
|
|
|
github.com/go-fed/httpsig v1.1.1-0.20201223112313-55836744818e // indirect
|
|
|
|
github.com/go-git/gcfg v1.5.1-0.20230307220236-3a3c6141e376 // indirect
|
|
|
|
github.com/go-ini/ini v1.67.0 // indirect
|
|
|
|
github.com/go-openapi/analysis v0.23.0 // indirect
|
|
|
|
github.com/go-openapi/errors v0.22.0 // indirect
|
|
|
|
github.com/go-openapi/inflect v0.21.0 // indirect
|
|
|
|
github.com/go-openapi/jsonpointer v0.21.0 // indirect
|
|
|
|
github.com/go-openapi/jsonreference v0.21.0 // indirect
|
|
|
|
github.com/go-openapi/loads v0.22.0 // indirect
|
|
|
|
github.com/go-openapi/runtime v0.28.0 // indirect
|
|
|
|
github.com/go-openapi/spec v0.21.0 // indirect
|
|
|
|
github.com/go-openapi/strfmt v0.23.0 // indirect
|
|
|
|
github.com/go-openapi/swag v0.23.0 // indirect
|
|
|
|
github.com/go-openapi/validate v0.24.0 // indirect
|
|
|
|
github.com/go-webauthn/x v0.1.15 // indirect
|
|
|
|
github.com/goccy/go-json v0.10.3 // indirect
|
|
|
|
github.com/golang-jwt/jwt/v4 v4.5.0 // indirect
|
|
|
|
github.com/golang-sql/civil v0.0.0-20220223132316-b832511892a9 // indirect
|
|
|
|
github.com/golang-sql/sqlexp v0.1.0 // indirect
|
|
|
|
github.com/golang/geo v0.0.0-20230421003525-6adc56603217 // indirect
|
|
|
|
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
|
|
|
|
github.com/golang/protobuf v1.5.4 // indirect
|
|
|
|
github.com/golang/snappy v0.0.4 // indirect
|
|
|
|
github.com/google/btree v1.1.3 // indirect
|
|
|
|
github.com/google/go-querystring v1.1.0 // indirect
|
|
|
|
github.com/google/go-tpm v0.9.1 // indirect
|
|
|
|
github.com/gorilla/css v1.0.1 // indirect
|
|
|
|
github.com/gorilla/handlers v1.5.2 // indirect
|
|
|
|
github.com/gorilla/mux v1.8.1 // indirect
|
|
|
|
github.com/gorilla/securecookie v1.1.2 // indirect
|
|
|
|
github.com/h2non/parth v0.0.0-20190131123155-b4df798d6542 // indirect
|
Introduce globallock as distributed locks (#31908)
To help #31813, but do not replace it, since this PR just introduces the
new module but misses some work:
- New option in settings. `#31813` has done it.
- Use the locks in business logic. `#31813` has done it.
So I think the most efficient way is to merge this PR first (if it's
acceptable) and then finish #31813.
## Design principles
### Use spinlock even in memory implementation
In actual use cases, users may cancel requests. `sync.Mutex` will block
the goroutine until the lock is acquired even if the request is
canceled. And the spinlock is more suitable for this scenario since it's
possible to give up the lock acquisition.
Although the spinlock consumes more CPU resources, I think it's
acceptable in most cases.
### Do not expose the mutex to callers
If we expose the mutex to callers, it's possible for callers to reuse
the mutex, which causes more complexity.
For example:
```go
lock := GetLocker(key)
lock.Lock()
// ...
// even if the lock is unlocked, we cannot GC the lock,
// since the caller may still use it again.
lock.Unlock()
lock.Lock()
// ...
lock.Unlock()
// callers have to GC the lock manually.
RemoveLocker(key)
```
That's why
https://github.com/go-gitea/gitea/pull/31813#discussion_r1721200549
In this PR, we only expose `ReleaseFunc` to callers. So callers just
need to call `ReleaseFunc` to release the lock, and do not need to care
about the lock's lifecycle.
```go
_, release, err := locker.Lock(ctx, key)
if err != nil {
return err
}
// ...
release()
// if callers want to lock again, they have to re-acquire the lock.
_, release, err := locker.Lock(ctx, key)
// ...
```
In this way, it's also much easier for redis implementation to extend
the mutex automatically, so that callers do not need to care about the
lock's lifecycle. See also
https://github.com/go-gitea/gitea/pull/31813#discussion_r1722659743
### Use "release" instead of "unlock"
For "unlock", it has the meaning of "unlock an acquired lock". So it's
not acceptable to call "unlock" when failed to acquire the lock, or call
"unlock" multiple times. It causes more complexity for callers to decide
whether to call "unlock" or not.
So we use "release" instead of "unlock" to make it clear. Whether the
lock is acquired or not, callers can always call "release", and it's
also safe to call "release" multiple times.
But the code DO NOT expect callers to not call "release" after acquiring
the lock. If callers forget to call "release", it will cause resource
leak. That's why it's always safe to call "release" without extra
checks: to avoid callers to forget to call it.
### Acquired locks could be lost
Unlike `sync.Mutex` which will be locked forever once acquired until
calling `Unlock`, in the new module, the acquired lock could be lost.
For example, the caller has acquired the lock, and it holds the lock for
a long time since auto-extending is working for redis. However, it lost
the connection to the redis server, and it's impossible to extend the
lock anymore.
If the caller don't stop what it's doing, another instance which can
connect to the redis server could acquire the lock, and do the same
thing, which could cause data inconsistency.
So the caller should know what happened, the solution is to return a new
context which will be canceled if the lock is lost or released:
```go
ctx, release, err := locker.Lock(ctx, key)
if err != nil {
return err
}
defer release()
// ...
DoSomething(ctx)
// the lock is lost now, then ctx has been canceled.
// Failed, since ctx has been canceled.
DoSomethingElse(ctx)
```
### Multiple ways to use the lock
1. Regular way
```go
ctx, release, err := Lock(ctx, key)
if err != nil {
return err
}
defer release()
// ...
```
2. Early release
```go
ctx, release, err := Lock(ctx, key)
if err != nil {
return err
}
defer release()
// ...
// release the lock earlier and reset the context back
ctx = release()
// continue to do something else
// ...
```
3. Functional way
```go
if err := LockAndDo(ctx, key, func(ctx context.Context) error {
// ...
return nil
}); err != nil {
return err
}
```
3 months ago
|
|
|
github.com/hashicorp/errwrap v1.1.0 // indirect
|
|
|
|
github.com/hashicorp/go-cleanhttp v0.5.2 // indirect
|
Introduce globallock as distributed locks (#31908)
To help #31813, but do not replace it, since this PR just introduces the
new module but misses some work:
- New option in settings. `#31813` has done it.
- Use the locks in business logic. `#31813` has done it.
So I think the most efficient way is to merge this PR first (if it's
acceptable) and then finish #31813.
## Design principles
### Use spinlock even in memory implementation
In actual use cases, users may cancel requests. `sync.Mutex` will block
the goroutine until the lock is acquired even if the request is
canceled. And the spinlock is more suitable for this scenario since it's
possible to give up the lock acquisition.
Although the spinlock consumes more CPU resources, I think it's
acceptable in most cases.
### Do not expose the mutex to callers
If we expose the mutex to callers, it's possible for callers to reuse
the mutex, which causes more complexity.
For example:
```go
lock := GetLocker(key)
lock.Lock()
// ...
// even if the lock is unlocked, we cannot GC the lock,
// since the caller may still use it again.
lock.Unlock()
lock.Lock()
// ...
lock.Unlock()
// callers have to GC the lock manually.
RemoveLocker(key)
```
That's why
https://github.com/go-gitea/gitea/pull/31813#discussion_r1721200549
In this PR, we only expose `ReleaseFunc` to callers. So callers just
need to call `ReleaseFunc` to release the lock, and do not need to care
about the lock's lifecycle.
```go
_, release, err := locker.Lock(ctx, key)
if err != nil {
return err
}
// ...
release()
// if callers want to lock again, they have to re-acquire the lock.
_, release, err := locker.Lock(ctx, key)
// ...
```
In this way, it's also much easier for redis implementation to extend
the mutex automatically, so that callers do not need to care about the
lock's lifecycle. See also
https://github.com/go-gitea/gitea/pull/31813#discussion_r1722659743
### Use "release" instead of "unlock"
For "unlock", it has the meaning of "unlock an acquired lock". So it's
not acceptable to call "unlock" when failed to acquire the lock, or call
"unlock" multiple times. It causes more complexity for callers to decide
whether to call "unlock" or not.
So we use "release" instead of "unlock" to make it clear. Whether the
lock is acquired or not, callers can always call "release", and it's
also safe to call "release" multiple times.
But the code DO NOT expect callers to not call "release" after acquiring
the lock. If callers forget to call "release", it will cause resource
leak. That's why it's always safe to call "release" without extra
checks: to avoid callers to forget to call it.
### Acquired locks could be lost
Unlike `sync.Mutex` which will be locked forever once acquired until
calling `Unlock`, in the new module, the acquired lock could be lost.
For example, the caller has acquired the lock, and it holds the lock for
a long time since auto-extending is working for redis. However, it lost
the connection to the redis server, and it's impossible to extend the
lock anymore.
If the caller don't stop what it's doing, another instance which can
connect to the redis server could acquire the lock, and do the same
thing, which could cause data inconsistency.
So the caller should know what happened, the solution is to return a new
context which will be canceled if the lock is lost or released:
```go
ctx, release, err := locker.Lock(ctx, key)
if err != nil {
return err
}
defer release()
// ...
DoSomething(ctx)
// the lock is lost now, then ctx has been canceled.
// Failed, since ctx has been canceled.
DoSomethingElse(ctx)
```
### Multiple ways to use the lock
1. Regular way
```go
ctx, release, err := Lock(ctx, key)
if err != nil {
return err
}
defer release()
// ...
```
2. Early release
```go
ctx, release, err := Lock(ctx, key)
if err != nil {
return err
}
defer release()
// ...
// release the lock earlier and reset the context back
ctx = release()
// continue to do something else
// ...
```
3. Functional way
```go
if err := LockAndDo(ctx, key, func(ctx context.Context) error {
// ...
return nil
}); err != nil {
return err
}
```
3 months ago
|
|
|
github.com/hashicorp/go-multierror v1.1.1 // indirect
|
|
|
|
github.com/hashicorp/go-retryablehttp v0.7.7 // indirect
|
|
|
|
github.com/hashicorp/hcl v1.0.0 // indirect
|
|
|
|
github.com/jbenet/go-context v0.0.0-20150711004518-d14ea06fba99 // indirect
|
|
|
|
github.com/jessevdk/go-flags v1.6.1 // indirect
|
|
|
|
github.com/josharian/intern v1.0.0 // indirect
|
|
|
|
github.com/kevinburke/ssh_config v1.2.0 // indirect
|
|
|
|
github.com/klauspost/pgzip v1.2.6 // indirect
|
|
|
|
github.com/kr/pretty v0.3.1 // indirect
|
|
|
|
github.com/kr/text v0.2.0 // indirect
|
|
|
|
github.com/libdns/libdns v0.2.2 // indirect
|
|
|
|
github.com/magiconair/properties v1.8.7 // indirect
|
|
|
|
github.com/mailru/easyjson v0.7.7 // indirect
|
|
|
|
github.com/markbates/going v1.0.3 // indirect
|
Implement actions (#21937)
Close #13539.
Co-authored by: @lunny @appleboy @fuxiaohei and others.
Related projects:
- https://gitea.com/gitea/actions-proto-def
- https://gitea.com/gitea/actions-proto-go
- https://gitea.com/gitea/act
- https://gitea.com/gitea/act_runner
### Summary
The target of this PR is to bring a basic implementation of "Actions",
an internal CI/CD system of Gitea. That means even though it has been
merged, the state of the feature is **EXPERIMENTAL**, and please note
that:
- It is disabled by default;
- It shouldn't be used in a production environment currently;
- It shouldn't be used in a public Gitea instance currently;
- Breaking changes may be made before it's stable.
**Please comment on #13539 if you have any different product design
ideas**, all decisions reached there will be adopted here. But in this
PR, we don't talk about **naming, feature-creep or alternatives**.
### ⚠️ Breaking
`gitea-actions` will become a reserved user name. If a user with the
name already exists in the database, it is recommended to rename it.
### Some important reviews
- What is `DEFAULT_ACTIONS_URL` in `app.ini` for?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1055954954
- Why the api for runners is not under the normal `/api/v1` prefix?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1061173592
- Why DBFS?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1061301178
- Why ignore events triggered by `gitea-actions` bot?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1063254103
- Why there's no permission control for actions?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1090229868
### What it looks like
<details>
#### Manage runners
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205870657-c72f590e-2e08-4cd4-be7f-2e0abb299bbf.png">
#### List runs
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205872794-50fde990-2b45-48c1-a178-908e4ec5b627.png">
#### View logs
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205872501-9b7b9000-9542-4991-8f55-18ccdada77c3.png">
</details>
### How to try it
<details>
#### 1. Start Gitea
Clone this branch and [install from
source](https://docs.gitea.io/en-us/install-from-source).
Add additional configurations in `app.ini` to enable Actions:
```ini
[actions]
ENABLED = true
```
Start it.
If all is well, you'll see the management page of runners:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205877365-8e30a780-9b10-4154-b3e8-ee6c3cb35a59.png">
#### 2. Start runner
Clone the [act_runner](https://gitea.com/gitea/act_runner), and follow
the
[README](https://gitea.com/gitea/act_runner/src/branch/main/README.md)
to start it.
If all is well, you'll see a new runner has been added:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205878000-216f5937-e696-470d-b66c-8473987d91c3.png">
#### 3. Enable actions for a repo
Create a new repo or open an existing one, check the `Actions` checkbox
in settings and submit.
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205879705-53e09208-73c0-4b3e-a123-2dcf9aba4b9c.png">
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205879383-23f3d08f-1a85-41dd-a8b3-54e2ee6453e8.png">
If all is well, you'll see a new tab "Actions":
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205881648-a8072d8c-5803-4d76-b8a8-9b2fb49516c1.png">
#### 4. Upload workflow files
Upload some workflow files to `.gitea/workflows/xxx.yaml`, you can
follow the [quickstart](https://docs.github.com/en/actions/quickstart)
of GitHub Actions. Yes, Gitea Actions is compatible with GitHub Actions
in most cases, you can use the same demo:
```yaml
name: GitHub Actions Demo
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
on: [push]
jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
- run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
- name: Check out repository code
uses: actions/checkout@v3
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ github.workspace }}
- run: echo "🍏 This job's status is ${{ job.status }}."
```
If all is well, you'll see a new run in `Actions` tab:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205884473-79a874bc-171b-4aaf-acd5-0241a45c3b53.png">
#### 5. Check the logs of jobs
Click a run and you'll see the logs:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205884800-994b0374-67f7-48ff-be9a-4c53f3141547.png">
#### 6. Go on
You can try more examples in [the
documents](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions)
of GitHub Actions, then you might find a lot of bugs.
Come on, PRs are welcome.
</details>
See also: [Feature Preview: Gitea
Actions](https://blog.gitea.io/2022/12/feature-preview-gitea-actions/)
---------
Co-authored-by: a1012112796 <1012112796@qq.com>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: delvh <dev.lh@web.de>
Co-authored-by: ChristopherHX <christopher.homberger@web.de>
Co-authored-by: John Olheiser <john.olheiser@gmail.com>
2 years ago
|
|
|
github.com/mattn/go-colorable v0.1.13 // indirect
|
|
|
|
github.com/mattn/go-runewidth v0.0.16 // indirect
|
|
|
|
github.com/mholt/acmez/v2 v2.0.3 // indirect
|
|
|
|
github.com/miekg/dns v1.1.62 // indirect
|
|
|
|
github.com/minio/md5-simd v1.1.2 // indirect
|
|
|
|
github.com/mitchellh/copystructure v1.2.0 // indirect
|
|
|
|
github.com/mitchellh/mapstructure v1.5.0 // indirect
|
|
|
|
github.com/mitchellh/reflectwalk v1.0.2 // indirect
|
|
|
|
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
|
|
|
|
github.com/modern-go/reflect2 v1.0.2 // indirect
|
|
|
|
github.com/mrjones/oauth v0.0.0-20190623134757-126b35219450 // indirect
|
|
|
|
github.com/mschoch/smat v0.2.0 // indirect
|
|
|
|
github.com/munnerz/goautoneg v0.0.0-20191010083416-a7dc8b61c822 // indirect
|
|
|
|
github.com/nwaples/rardecode v1.1.3 // indirect
|
|
|
|
github.com/oklog/ulid v1.3.1 // indirect
|
|
|
|
github.com/olekukonko/tablewriter v0.0.5 // indirect
|
|
|
|
github.com/onsi/ginkgo v1.16.5 // indirect
|
|
|
|
github.com/paulmach/orb v0.11.1 // indirect
|
|
|
|
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
|
|
|
|
github.com/pierrec/lz4/v4 v4.1.21 // indirect
|
|
|
|
github.com/pjbgf/sha1cd v0.3.0 // indirect
|
|
|
|
github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect
|
|
|
|
github.com/prometheus/client_model v0.6.1 // indirect
|
|
|
|
github.com/prometheus/common v0.60.1 // indirect
|
|
|
|
github.com/prometheus/procfs v0.15.1 // indirect
|
|
|
|
github.com/rhysd/actionlint v1.7.3 // indirect
|
|
|
|
github.com/rivo/uniseg v0.4.7 // indirect
|
|
|
|
github.com/rogpeppe/go-internal v1.13.1 // indirect
|
|
|
|
github.com/rs/xid v1.6.0 // indirect
|
|
|
|
github.com/russross/blackfriday/v2 v2.1.0 // indirect
|
|
|
|
github.com/sagikazarmark/locafero v0.6.0 // indirect
|
|
|
|
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
|
|
|
|
github.com/segmentio/asm v1.2.0 // indirect
|
|
|
|
github.com/shopspring/decimal v1.4.0 // indirect
|
|
|
|
github.com/shurcooL/httpfs v0.0.0-20230704072500-f1e31cf0ba5c // indirect
|
|
|
|
github.com/sirupsen/logrus v1.9.3 // indirect
|
|
|
|
github.com/skeema/knownhosts v1.3.0 // indirect
|
|
|
|
github.com/sourcegraph/conc v0.3.0 // indirect
|
|
|
|
github.com/spf13/afero v1.11.0 // indirect
|
|
|
|
github.com/spf13/cast v1.7.0 // indirect
|
|
|
|
github.com/spf13/pflag v1.0.5 // indirect
|
|
|
|
github.com/spf13/viper v1.19.0 // indirect
|
|
|
|
github.com/ssor/bom v0.0.0-20170718123548-6386211fdfcf // indirect
|
|
|
|
github.com/subosito/gotenv v1.6.0 // indirect
|
|
|
|
github.com/toqueteos/webbrowser v1.2.0 // indirect
|
|
|
|
github.com/unknwon/com v1.0.1 // indirect
|
|
|
|
github.com/valyala/fastjson v1.6.4 // indirect
|
|
|
|
github.com/x448/float16 v0.8.4 // indirect
|
|
|
|
github.com/xanzy/ssh-agent v0.3.3 // indirect
|
|
|
|
github.com/xeipuuv/gojsonpointer v0.0.0-20190905194746-02993c407bfb // indirect
|
|
|
|
github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415 // indirect
|
|
|
|
github.com/xi2/xz v0.0.0-20171230120015-48954b6210f8 // indirect
|
|
|
|
github.com/xrash/smetrics v0.0.0-20240521201337-686a1a2994c1 // indirect
|
|
|
|
github.com/zeebo/assert v1.3.0 // indirect
|
|
|
|
github.com/zeebo/blake3 v0.2.4 // indirect
|
|
|
|
go.etcd.io/bbolt v1.3.11 // indirect
|
|
|
|
go.mongodb.org/mongo-driver v1.17.1 // indirect
|
|
|
|
go.opentelemetry.io/otel v1.31.0 // indirect
|
|
|
|
go.opentelemetry.io/otel/trace v1.31.0 // indirect
|
|
|
|
go.uber.org/atomic v1.11.0 // indirect
|
|
|
|
go.uber.org/multierr v1.11.0 // indirect
|
|
|
|
go.uber.org/zap v1.27.0 // indirect
|
|
|
|
golang.org/x/exp v0.0.0-20241009180824-f66d83c29e7c // indirect
|
|
|
|
golang.org/x/mod v0.21.0 // indirect
|
|
|
|
golang.org/x/sync v0.8.0 // indirect
|
|
|
|
golang.org/x/time v0.7.0 // indirect
|
|
|
|
google.golang.org/genproto/googleapis/rpc v0.0.0-20241021214115-324edc3d5d38 // indirect
|
|
|
|
gopkg.in/alexcesaro/quotedprintable.v3 v3.0.0-20150716171945-2caba252f4dc // indirect
|
|
|
|
gopkg.in/warnings.v0 v0.1.2 // indirect
|
|
|
|
gopkg.in/yaml.v2 v2.4.0 // indirect
|
|
|
|
)
|
|
|
|
|
|
|
|
replace github.com/hashicorp/go-version => github.com/6543/go-version v1.3.1
|
|
|
|
|
|
|
|
replace github.com/shurcooL/vfsgen => github.com/lunny/vfsgen v0.0.0-20220105142115-2c99e1ffdfa0
|
|
|
|
|
|
|
|
replace github.com/nektos/act => gitea.com/gitea/act v0.261.3
|
Implement actions (#21937)
Close #13539.
Co-authored by: @lunny @appleboy @fuxiaohei and others.
Related projects:
- https://gitea.com/gitea/actions-proto-def
- https://gitea.com/gitea/actions-proto-go
- https://gitea.com/gitea/act
- https://gitea.com/gitea/act_runner
### Summary
The target of this PR is to bring a basic implementation of "Actions",
an internal CI/CD system of Gitea. That means even though it has been
merged, the state of the feature is **EXPERIMENTAL**, and please note
that:
- It is disabled by default;
- It shouldn't be used in a production environment currently;
- It shouldn't be used in a public Gitea instance currently;
- Breaking changes may be made before it's stable.
**Please comment on #13539 if you have any different product design
ideas**, all decisions reached there will be adopted here. But in this
PR, we don't talk about **naming, feature-creep or alternatives**.
### ⚠️ Breaking
`gitea-actions` will become a reserved user name. If a user with the
name already exists in the database, it is recommended to rename it.
### Some important reviews
- What is `DEFAULT_ACTIONS_URL` in `app.ini` for?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1055954954
- Why the api for runners is not under the normal `/api/v1` prefix?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1061173592
- Why DBFS?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1061301178
- Why ignore events triggered by `gitea-actions` bot?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1063254103
- Why there's no permission control for actions?
- https://github.com/go-gitea/gitea/pull/21937#discussion_r1090229868
### What it looks like
<details>
#### Manage runners
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205870657-c72f590e-2e08-4cd4-be7f-2e0abb299bbf.png">
#### List runs
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205872794-50fde990-2b45-48c1-a178-908e4ec5b627.png">
#### View logs
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205872501-9b7b9000-9542-4991-8f55-18ccdada77c3.png">
</details>
### How to try it
<details>
#### 1. Start Gitea
Clone this branch and [install from
source](https://docs.gitea.io/en-us/install-from-source).
Add additional configurations in `app.ini` to enable Actions:
```ini
[actions]
ENABLED = true
```
Start it.
If all is well, you'll see the management page of runners:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205877365-8e30a780-9b10-4154-b3e8-ee6c3cb35a59.png">
#### 2. Start runner
Clone the [act_runner](https://gitea.com/gitea/act_runner), and follow
the
[README](https://gitea.com/gitea/act_runner/src/branch/main/README.md)
to start it.
If all is well, you'll see a new runner has been added:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205878000-216f5937-e696-470d-b66c-8473987d91c3.png">
#### 3. Enable actions for a repo
Create a new repo or open an existing one, check the `Actions` checkbox
in settings and submit.
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205879705-53e09208-73c0-4b3e-a123-2dcf9aba4b9c.png">
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205879383-23f3d08f-1a85-41dd-a8b3-54e2ee6453e8.png">
If all is well, you'll see a new tab "Actions":
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205881648-a8072d8c-5803-4d76-b8a8-9b2fb49516c1.png">
#### 4. Upload workflow files
Upload some workflow files to `.gitea/workflows/xxx.yaml`, you can
follow the [quickstart](https://docs.github.com/en/actions/quickstart)
of GitHub Actions. Yes, Gitea Actions is compatible with GitHub Actions
in most cases, you can use the same demo:
```yaml
name: GitHub Actions Demo
run-name: ${{ github.actor }} is testing out GitHub Actions 🚀
on: [push]
jobs:
Explore-GitHub-Actions:
runs-on: ubuntu-latest
steps:
- run: echo "🎉 The job was automatically triggered by a ${{ github.event_name }} event."
- run: echo "🐧 This job is now running on a ${{ runner.os }} server hosted by GitHub!"
- run: echo "🔎 The name of your branch is ${{ github.ref }} and your repository is ${{ github.repository }}."
- name: Check out repository code
uses: actions/checkout@v3
- run: echo "💡 The ${{ github.repository }} repository has been cloned to the runner."
- run: echo "🖥️ The workflow is now ready to test your code on the runner."
- name: List files in the repository
run: |
ls ${{ github.workspace }}
- run: echo "🍏 This job's status is ${{ job.status }}."
```
If all is well, you'll see a new run in `Actions` tab:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205884473-79a874bc-171b-4aaf-acd5-0241a45c3b53.png">
#### 5. Check the logs of jobs
Click a run and you'll see the logs:
<img width="1792" alt="image"
src="https://user-images.githubusercontent.com/9418365/205884800-994b0374-67f7-48ff-be9a-4c53f3141547.png">
#### 6. Go on
You can try more examples in [the
documents](https://docs.github.com/en/actions/using-workflows/workflow-syntax-for-github-actions)
of GitHub Actions, then you might find a lot of bugs.
Come on, PRs are welcome.
</details>
See also: [Feature Preview: Gitea
Actions](https://blog.gitea.io/2022/12/feature-preview-gitea-actions/)
---------
Co-authored-by: a1012112796 <1012112796@qq.com>
Co-authored-by: Lunny Xiao <xiaolunwen@gmail.com>
Co-authored-by: delvh <dev.lh@web.de>
Co-authored-by: ChristopherHX <christopher.homberger@web.de>
Co-authored-by: John Olheiser <john.olheiser@gmail.com>
2 years ago
|
|
|
|
|
|
|
replace github.com/charmbracelet/git-lfs-transfer => gitea.com/gitea/git-lfs-transfer v0.2.0
|
|
|
|
|
|
|
|
// TODO: This could be removed after https://github.com/mholt/archiver/pull/396 merged
|
|
|
|
replace github.com/mholt/archiver/v3 => github.com/anchore/archiver/v3 v3.5.2
|
|
|
|
|
|
|
|
exclude github.com/gofrs/uuid v3.2.0+incompatible
|
|
|
|
|
|
|
|
exclude github.com/gofrs/uuid v4.0.0+incompatible
|
|
|
|
|
|
|
|
exclude github.com/goccy/go-json v0.4.11
|
|
|
|
|
|
|
|
exclude github.com/satori/go.uuid v1.2.0
|