models should not depend on macaron #3321

Closed
opened 2025-11-02 05:08:08 -06:00 by GiteaMirror · 12 comments
Owner

Originally created by @zeripath on GitHub (May 13, 2019).

The models package dependency tree is rather complex. In particular it currently relies on and imports macaron.

This causes macaron's init to run even in gitea commands that will not run a webserver - it also prevents early mitigation of macaron's init.

We should move methods that require macaron out of models and in to routers or into modules and consider if there are other places in modules where we can avoid importing macaron.

Originally created by @zeripath on GitHub (May 13, 2019). The models package dependency tree is rather complex. In particular it currently relies on and imports macaron. This causes macaron's init to run even in gitea commands that will not run a webserver - it also prevents early mitigation of macaron's init. We should move methods that require macaron out of models and in to routers or into modules and consider if there are other places in modules where we can avoid importing macaron.
GiteaMirror added the issue/confirmedtopic/build labels 2025-11-02 05:08:08 -06:00
Author
Owner

@zeripath commented on GitHub (May 13, 2019):

This affects most of models/mail.go:

6dbd261852/models/mail.go (L47-L119)

In fact models/mail.go probably doesn't belong in models at all.

There is one place in models/login_source.go that depends on macaron/binding:

ef2a343e27/models/login_source.go (L411)

I suspect that this isn't the correct function and we have a different more specific check for validity of usernames.

@zeripath commented on GitHub (May 13, 2019): This affects most of models/mail.go: https://github.com/go-gitea/gitea/blob/6dbd26185203d464c4a4e32e7af04a34f37ae4f2/models/mail.go#L47-L119 In fact models/mail.go probably doesn't belong in models at all. There is one place in models/login_source.go that depends on macaron/binding: https://github.com/go-gitea/gitea/blob/ef2a343e27d8af2de0bb696bd60d9a019e1e8b69/models/login_source.go#L411 I suspect that this isn't the correct function and we have a different more specific check for validity of usernames.
Author
Owner

@zeripath commented on GitHub (May 13, 2019):

We should probably also look carefully at where we can dissect out macaron from modules - eg. modules/log I think depends on macaron because of the router log but this could/should be cleaned in such a way that it's moved out.

In general we should try to decouple as much of models as possible, and separate modules in to two sections - those that depend on models and those that models depends on.

@zeripath commented on GitHub (May 13, 2019): We should probably also look carefully at where we can dissect out macaron from modules - eg. modules/log I think depends on macaron because of the router log but this could/should be cleaned in such a way that it's moved out. In general we should try to decouple as much of models as possible, and separate modules in to two sections - those that depend on models and those that models depends on.
Author
Owner

@lunny commented on GitHub (May 13, 2019):

If #6931 merged, then we only left ef2a343e27/models/login_source.go (L411).

@lunny commented on GitHub (May 13, 2019): If #6931 merged, then we only left https://github.com/go-gitea/gitea/blob/ef2a343e27d8af2de0bb696bd60d9a019e1e8b69/models/login_source.go#L411.
Author
Owner

@lunny commented on GitHub (May 14, 2019):

@zeripath I would like to split modules as two parties, one will keep modules will be as basic packages dependent by models and other packages, another named service will depend on models and will be invoked by routers.

@lunny commented on GitHub (May 14, 2019): @zeripath I would like to split `modules` as two parties, one will keep `modules` will be as basic packages dependent by `models` and other packages, another named `service` will depend on `models` and will be invoked by `routers`.
Author
Owner

@zeripath commented on GitHub (May 20, 2019):

So unfortunately models depends on modules/auth which still depends on macaron. This is not to blame see below...

@zeripath commented on GitHub (May 20, 2019): ~~So unfortunately `models` depends on `modules/auth` which still depends on macaron.~~ This is not to blame see below...
Author
Owner

@zeripath commented on GitHub (Jun 17, 2019):

OK so I'm wrong above. The issue appears to be resulting from dependencies on:

:; for i in $(go list -f '{{ join .Imports  "\n"}}' code.gitea.io/gitea/models); do go list -f '{{ join .Deps "\n" }}' $i | grep "code.gitea.io/gitea/vendor/gopkg.in/macaron.v1" 1> /dev/null && echo $i; done
code.gitea.io/gitea/modules/auth/oauth2
code.gitea.io/gitea/modules/avatar
code.gitea.io/gitea/modules/base
code.gitea.io/gitea/modules/cache
code.gitea.io/gitea/modules/highlight
code.gitea.io/gitea/modules/indexer
code.gitea.io/gitea/modules/mailer
code.gitea.io/gitea/modules/markup
code.gitea.io/gitea/modules/markup/markdown
code.gitea.io/gitea/modules/options
code.gitea.io/gitea/modules/setting
code.gitea.io/gitea/modules/util
@zeripath commented on GitHub (Jun 17, 2019): OK so I'm wrong above. The issue appears to be resulting from dependencies on: ``` :; for i in $(go list -f '{{ join .Imports "\n"}}' code.gitea.io/gitea/models); do go list -f '{{ join .Deps "\n" }}' $i | grep "code.gitea.io/gitea/vendor/gopkg.in/macaron.v1" 1> /dev/null && echo $i; done code.gitea.io/gitea/modules/auth/oauth2 code.gitea.io/gitea/modules/avatar code.gitea.io/gitea/modules/base code.gitea.io/gitea/modules/cache code.gitea.io/gitea/modules/highlight code.gitea.io/gitea/modules/indexer code.gitea.io/gitea/modules/mailer code.gitea.io/gitea/modules/markup code.gitea.io/gitea/modules/markup/markdown code.gitea.io/gitea/modules/options code.gitea.io/gitea/modules/setting code.gitea.io/gitea/modules/util ```
Author
Owner

@zeripath commented on GitHub (Jun 17, 2019):

Which when looked at with a bit of a more complex script:

for i in $(go list -f '{{ join .Imports  "\n"}}' code.gitea.io/gitea/models); do                        [09:35:43]
    go list -f '{{ join .Deps "\n" }}' $i |
        grep "code.gitea.io/gitea/vendor/gopkg.in/macaron.v1" 1> /dev/null &&
        echo "Checking: $i" 1>&2 &&
        (for j in $(go list -f '{{ join .Imports  "\n"}}' $i); do go list -f '{{ join .Deps "\n" }}' $j | grep "code.gitea.io/gitea/vendor/gopkg.in/macaron.v1" 1> /dev/null && echo "  $j"; done)
    done

Results in:

Checking: code.gitea.io/gitea/modules/auth/oauth2
  code.gitea.io/gitea/modules/setting
Checking: code.gitea.io/gitea/modules/avatar
  code.gitea.io/gitea/modules/setting
Checking: code.gitea.io/gitea/modules/base
  code.gitea.io/gitea/modules/setting
  code.gitea.io/gitea/modules/util
Checking: code.gitea.io/gitea/modules/cache
  code.gitea.io/gitea/modules/setting
  code.gitea.io/gitea/vendor/github.com/go-macaron/cache
Checking: code.gitea.io/gitea/modules/highlight
  code.gitea.io/gitea/modules/setting
Checking: code.gitea.io/gitea/modules/indexer
  code.gitea.io/gitea/modules/setting
Checking: code.gitea.io/gitea/modules/mailer
  code.gitea.io/gitea/modules/base
  code.gitea.io/gitea/modules/setting
Checking: code.gitea.io/gitea/modules/markup
  code.gitea.io/gitea/modules/base
  code.gitea.io/gitea/modules/setting
  code.gitea.io/gitea/modules/util
Checking: code.gitea.io/gitea/modules/markup/markdown
  code.gitea.io/gitea/modules/markup
  code.gitea.io/gitea/modules/setting
  code.gitea.io/gitea/modules/util
Checking: code.gitea.io/gitea/modules/options
  code.gitea.io/gitea/modules/setting
Checking: code.gitea.io/gitea/modules/setting
  code.gitea.io/gitea/modules/session
  code.gitea.io/gitea/vendor/github.com/go-macaron/cache/memcache
  code.gitea.io/gitea/vendor/github.com/go-macaron/cache/redis
  code.gitea.io/gitea/vendor/github.com/go-macaron/cors
  code.gitea.io/gitea/vendor/github.com/go-macaron/session
  code.gitea.io/gitea/vendor/github.com/go-macaron/session/couchbase
  code.gitea.io/gitea/vendor/github.com/go-macaron/session/memcache
  code.gitea.io/gitea/vendor/github.com/go-macaron/session/mysql
  code.gitea.io/gitea/vendor/github.com/go-macaron/session/nodb
  code.gitea.io/gitea/vendor/github.com/go-macaron/session/postgres
  code.gitea.io/gitea/vendor/github.com/go-macaron/session/redis
Checking: code.gitea.io/gitea/modules/util
  code.gitea.io/gitea/modules/setting

Revealing that the naughty packages that independently depend on macaron are as follows:

code.gitea.io/gitea/modules/cache

Through its dependency on: code.gitea.io/gitea/vendor/github.com/go-macaron/cache

code.gitea.io/gitea/modules/setting

Through multiple dependencies:

code.gitea.io/gitea/modules/session
code.gitea.io/gitea/vendor/github.com/go-macaron/cache/memcache
code.gitea.io/gitea/vendor/github.com/go-macaron/cache/redis
code.gitea.io/gitea/vendor/github.com/go-macaron/cors
code.gitea.io/gitea/vendor/github.com/go-macaron/session
code.gitea.io/gitea/vendor/github.com/go-macaron/session/couchbase
code.gitea.io/gitea/vendor/github.com/go-macaron/session/memcache
code.gitea.io/gitea/vendor/github.com/go-macaron/session/mysql
code.gitea.io/gitea/vendor/github.com/go-macaron/session/nodb
code.gitea.io/gitea/vendor/github.com/go-macaron/session/postgres
code.gitea.io/gitea/vendor/github.com/go-macaron/session/redis
@zeripath commented on GitHub (Jun 17, 2019): Which when looked at with a bit of a more complex script: ```bash for i in $(go list -f '{{ join .Imports "\n"}}' code.gitea.io/gitea/models); do [09:35:43] go list -f '{{ join .Deps "\n" }}' $i | grep "code.gitea.io/gitea/vendor/gopkg.in/macaron.v1" 1> /dev/null && echo "Checking: $i" 1>&2 && (for j in $(go list -f '{{ join .Imports "\n"}}' $i); do go list -f '{{ join .Deps "\n" }}' $j | grep "code.gitea.io/gitea/vendor/gopkg.in/macaron.v1" 1> /dev/null && echo " $j"; done) done ``` Results in: ``` Checking: code.gitea.io/gitea/modules/auth/oauth2 code.gitea.io/gitea/modules/setting Checking: code.gitea.io/gitea/modules/avatar code.gitea.io/gitea/modules/setting Checking: code.gitea.io/gitea/modules/base code.gitea.io/gitea/modules/setting code.gitea.io/gitea/modules/util Checking: code.gitea.io/gitea/modules/cache code.gitea.io/gitea/modules/setting code.gitea.io/gitea/vendor/github.com/go-macaron/cache Checking: code.gitea.io/gitea/modules/highlight code.gitea.io/gitea/modules/setting Checking: code.gitea.io/gitea/modules/indexer code.gitea.io/gitea/modules/setting Checking: code.gitea.io/gitea/modules/mailer code.gitea.io/gitea/modules/base code.gitea.io/gitea/modules/setting Checking: code.gitea.io/gitea/modules/markup code.gitea.io/gitea/modules/base code.gitea.io/gitea/modules/setting code.gitea.io/gitea/modules/util Checking: code.gitea.io/gitea/modules/markup/markdown code.gitea.io/gitea/modules/markup code.gitea.io/gitea/modules/setting code.gitea.io/gitea/modules/util Checking: code.gitea.io/gitea/modules/options code.gitea.io/gitea/modules/setting Checking: code.gitea.io/gitea/modules/setting code.gitea.io/gitea/modules/session code.gitea.io/gitea/vendor/github.com/go-macaron/cache/memcache code.gitea.io/gitea/vendor/github.com/go-macaron/cache/redis code.gitea.io/gitea/vendor/github.com/go-macaron/cors code.gitea.io/gitea/vendor/github.com/go-macaron/session code.gitea.io/gitea/vendor/github.com/go-macaron/session/couchbase code.gitea.io/gitea/vendor/github.com/go-macaron/session/memcache code.gitea.io/gitea/vendor/github.com/go-macaron/session/mysql code.gitea.io/gitea/vendor/github.com/go-macaron/session/nodb code.gitea.io/gitea/vendor/github.com/go-macaron/session/postgres code.gitea.io/gitea/vendor/github.com/go-macaron/session/redis Checking: code.gitea.io/gitea/modules/util code.gitea.io/gitea/modules/setting ``` Revealing that the naughty packages that independently depend on macaron are as follows: ### `code.gitea.io/gitea/modules/cache` Through its dependency on: `code.gitea.io/gitea/vendor/github.com/go-macaron/cache` ### `code.gitea.io/gitea/modules/setting` Through multiple dependencies: ``` code.gitea.io/gitea/modules/session code.gitea.io/gitea/vendor/github.com/go-macaron/cache/memcache code.gitea.io/gitea/vendor/github.com/go-macaron/cache/redis code.gitea.io/gitea/vendor/github.com/go-macaron/cors code.gitea.io/gitea/vendor/github.com/go-macaron/session code.gitea.io/gitea/vendor/github.com/go-macaron/session/couchbase code.gitea.io/gitea/vendor/github.com/go-macaron/session/memcache code.gitea.io/gitea/vendor/github.com/go-macaron/session/mysql code.gitea.io/gitea/vendor/github.com/go-macaron/session/nodb code.gitea.io/gitea/vendor/github.com/go-macaron/session/postgres code.gitea.io/gitea/vendor/github.com/go-macaron/session/redis
Author
Owner

@stale[bot] commented on GitHub (Aug 16, 2019):

This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs during the next 2 weeks. Thank you for your contributions.

@stale[bot] commented on GitHub (Aug 16, 2019): This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs during the next 2 weeks. Thank you for your contributions.
Author
Owner

@lunny commented on GitHub (Jan 4, 2020):

@zeripath I think this could be closed.

@lunny commented on GitHub (Jan 4, 2020): @zeripath I think this could be closed.
Author
Owner

@lunny commented on GitHub (Jan 28, 2020):

Closed as when go list -f '{{ join .Imports "\n"}}' code.gitea.io/gitea/models on commit 28216bde46 :

bufio
bytes
code.gitea.io/gitea/modules/auth/ldap
code.gitea.io/gitea/modules/auth/oauth2
code.gitea.io/gitea/modules/auth/openid
code.gitea.io/gitea/modules/auth/pam
code.gitea.io/gitea/modules/avatar
code.gitea.io/gitea/modules/base
code.gitea.io/gitea/modules/generate
code.gitea.io/gitea/modules/git
code.gitea.io/gitea/modules/log
code.gitea.io/gitea/modules/markup
code.gitea.io/gitea/modules/markup/markdown
code.gitea.io/gitea/modules/options
code.gitea.io/gitea/modules/process
code.gitea.io/gitea/modules/references
code.gitea.io/gitea/modules/secret
code.gitea.io/gitea/modules/setting
code.gitea.io/gitea/modules/structs
code.gitea.io/gitea/modules/timeutil
code.gitea.io/gitea/modules/util
container/list
context
crypto
crypto/aes
crypto/cipher
crypto/md5
crypto/rand
crypto/rsa
crypto/sha1
crypto/sha256
crypto/subtle
crypto/tls
crypto/x509
database/sql
encoding/asn1
encoding/base64
encoding/binary
encoding/hex
encoding/json
encoding/pem
errors
fmt
github.com/denisenkom/go-mssqldb
github.com/dgrijalva/jwt-go
github.com/go-sql-driver/mysql
github.com/gobwas/glob
github.com/keybase/go-crypto/openpgp
github.com/keybase/go-crypto/openpgp/armor
github.com/keybase/go-crypto/openpgp/packet
github.com/lib/pq
github.com/markbates/goth
github.com/pquerna/otp/totp
github.com/satori/go.uuid
github.com/stretchr/testify/assert
github.com/tstranex/u2f
github.com/unknwon/com
golang.org/x/crypto/argon2
golang.org/x/crypto/bcrypt
golang.org/x/crypto/pbkdf2
golang.org/x/crypto/scrypt
golang.org/x/crypto/ssh
gopkg.in/testfixtures.v2
hash
html/template
image/jpeg
image/png
io
io/ioutil
math
math/big
mime/multipart
net/smtp
net/textproto
net/url
os
path
path/filepath
reflect
regexp
sort
strconv
strings
sync
testing
time
unicode/utf8
xorm.io/builder
xorm.io/core
xorm.io/xorm
@lunny commented on GitHub (Jan 28, 2020): Closed as when `go list -f '{{ join .Imports "\n"}}' code.gitea.io/gitea/models` on commit 28216bde46a8cf415755ca41f3d58843eeb45e7c : ``` bufio bytes code.gitea.io/gitea/modules/auth/ldap code.gitea.io/gitea/modules/auth/oauth2 code.gitea.io/gitea/modules/auth/openid code.gitea.io/gitea/modules/auth/pam code.gitea.io/gitea/modules/avatar code.gitea.io/gitea/modules/base code.gitea.io/gitea/modules/generate code.gitea.io/gitea/modules/git code.gitea.io/gitea/modules/log code.gitea.io/gitea/modules/markup code.gitea.io/gitea/modules/markup/markdown code.gitea.io/gitea/modules/options code.gitea.io/gitea/modules/process code.gitea.io/gitea/modules/references code.gitea.io/gitea/modules/secret code.gitea.io/gitea/modules/setting code.gitea.io/gitea/modules/structs code.gitea.io/gitea/modules/timeutil code.gitea.io/gitea/modules/util container/list context crypto crypto/aes crypto/cipher crypto/md5 crypto/rand crypto/rsa crypto/sha1 crypto/sha256 crypto/subtle crypto/tls crypto/x509 database/sql encoding/asn1 encoding/base64 encoding/binary encoding/hex encoding/json encoding/pem errors fmt github.com/denisenkom/go-mssqldb github.com/dgrijalva/jwt-go github.com/go-sql-driver/mysql github.com/gobwas/glob github.com/keybase/go-crypto/openpgp github.com/keybase/go-crypto/openpgp/armor github.com/keybase/go-crypto/openpgp/packet github.com/lib/pq github.com/markbates/goth github.com/pquerna/otp/totp github.com/satori/go.uuid github.com/stretchr/testify/assert github.com/tstranex/u2f github.com/unknwon/com golang.org/x/crypto/argon2 golang.org/x/crypto/bcrypt golang.org/x/crypto/pbkdf2 golang.org/x/crypto/scrypt golang.org/x/crypto/ssh gopkg.in/testfixtures.v2 hash html/template image/jpeg image/png io io/ioutil math math/big mime/multipart net/smtp net/textproto net/url os path path/filepath reflect regexp sort strconv strings sync testing time unicode/utf8 xorm.io/builder xorm.io/core xorm.io/xorm ```
Author
Owner

@zeripath commented on GitHub (Jan 28, 2020):

It still does...

go list -f '{{ join .Deps "\n"}}' code.gitea.io/gitea/models  | grep macaron
gitea.com/macaron/cache
gitea.com/macaron/cache/memcache
gitea.com/macaron/cache/redis
gitea.com/macaron/cors
gitea.com/macaron/inject
gitea.com/macaron/macaron
gitea.com/macaron/session

I think it's through modules/setting which makes it a bit difficult to remove.

@zeripath commented on GitHub (Jan 28, 2020): It still does... ``` go list -f '{{ join .Deps "\n"}}' code.gitea.io/gitea/models | grep macaron ``` ``` gitea.com/macaron/cache gitea.com/macaron/cache/memcache gitea.com/macaron/cache/redis gitea.com/macaron/cors gitea.com/macaron/inject gitea.com/macaron/macaron gitea.com/macaron/session ``` I think it's through modules/setting which makes it a bit difficult to remove.
Author
Owner

@zeripath commented on GitHub (Jan 28, 2020):

yup it's through setting. which means I guess we need to remove the dependency on macaron from setting.

@zeripath commented on GitHub (Jan 28, 2020): yup it's through setting. which means I guess we need to remove the dependency on macaron from setting.
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: github-starred/gitea#3321