Skip to content

Commit f1c55ff

Browse files
committed
Code improvements
1 parent e96256a commit f1c55ff

File tree

8 files changed

+93
-116
lines changed

8 files changed

+93
-116
lines changed

docs/content/doc/advanced/config-cheat-sheet.zh-cn.md

Lines changed: 4 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -182,30 +182,14 @@ menu:
182182
- `DISABLE_GRAVATAR`: 开启则只使用内部头像。
183183
- `ENABLE_FEDERATED_AVATAR`: 启用头像联盟支持 (参见 http://www.libravatar.org)
184184

185-
- `AVATAR_STORE_TYPE`: **local**: 头像存储类型,可以为 `local``minio`,分别支持本地文件系统和 minio 兼容的API。
186-
- `AVATAR_UPLOAD_PATH`: **data/avatars**: 存储头像的文件系统路径,仅当 `AVATAR_STORE_TYPE``local` 有效。
187-
- `AVATAR_SERVE_DIRECT`: **false**: 允许直接重定向到存储系统。当前,仅 Minio/S3 是支持的。
188-
- `AVATAR_MINIO_ENDPOINT`: **localhost:9000**: Minio 地址,仅当 `AVATAR_STORE_TYPE``minio` 时有效。
189-
- `AVATAR_MINIO_ACCESS_KEY_ID`: Minio accessKeyID,仅当 `AVATAR_STORE_TYPE``minio` 时有效。
190-
- `AVATAR_MINIO_SECRET_ACCESS_KEY`: Minio secretAccessKey,仅当 `AVATAR_STORE_TYPE``minio` 时有效。
191-
- `AVATAR_MINIO_BUCKET`: **gitea**: Minio bucket,仅当 `AVATAR_STORE_TYPE``minio` 时有效。
192-
- `AVATAR_MINIO_LOCATION`: **us-east-1**: Minio location ,仅当 `AVATAR_STORE_TYPE``minio` 时有效。
193-
- `AVATAR_MINIO_BASE_PATH`: **avatars/**: Minio base path ,仅当 `AVATAR_STORE_TYPE``minio` 时有效。
194-
- `AVATAR_MINIO_USE_SSL`: **false**: Minio 是否启用 ssl ,仅当 `AVATAR_STORE_TYPE``minio` 时有效。
185+
- `AVATAR_STORAGE_TYPE`: **local**: 头像存储类型,可以为 `local``minio`,分别支持本地文件系统和 minio 兼容的API。
186+
- `AVATAR_UPLOAD_PATH`: **data/avatars**: 存储头像的文件系统路径。
195187
- `AVATAR_MAX_WIDTH`: **4096**: 头像最大宽度,单位像素。
196188
- `AVATAR_MAX_HEIGHT`: **3072**: 头像最大高度,单位像素。
197189
- `AVATAR_MAX_FILE_SIZE`: **1048576** (1Mb): 头像最大大小。
198190

199-
- `REPOSITORY_AVATAR_STORE_TYPE`: **local**: 仓库头像存储类型,可以为 `local``minio`,分别支持本地文件系统和 minio 兼容的API。
200-
- `REPOSITORY_AVATAR_UPLOAD_PATH`: **data/repo-avatars**: 存储仓库头像的文件系统路径,仅当 `REPOSITORY_AVATAR_STORE_TYPE``local` 有效。
201-
- `REPOSITORY_AVATAR_SERVE_DIRECT`: **false**: 允许直接重定向到存储系统。当前,仅 Minio/S3 是支持的。
202-
- `REPOSITORY_AVATAR_MINIO_ENDPOINT`: **localhost:9000**: Minio 地址,仅当 `REPOSITORY_AVATAR_STORE_TYPE``minio` 时有效。
203-
- `REPOSITORY_AVATAR_MINIO_ACCESS_KEY_ID`: Minio accessKeyID,仅当 `REPOSITORY_AVATAR_STORE_TYPE``minio` 时有效。
204-
- `REPOSITORY_AVATAR_MINIO_SECRET_ACCESS_KEY`: Minio secretAccessKey,仅当 `REPOSITORY_AVATAR_STORE_TYPE``minio` 时有效。
205-
- `REPOSITORY_AVATAR_MINIO_BUCKET`: **gitea**: Minio bucket,仅当 `REPOSITORY_AVATAR_STORE_TYPE``minio` 时有效。
206-
- `REPOSITORY_AVATAR_MINIO_LOCATION`: **us-east-1**: Minio location ,仅当 `REPOSITORY_AVATAR_STORE_TYPE``minio` 时有效。
207-
- `REPOSITORY_AVATAR_MINIO_BASE_PATH`: **repo-avatars/**: Minio base path ,仅当 `REPOSITORY_AVATAR_STORE_TYPE``minio` 时有效。
208-
- `REPOSITORY_AVATAR_MINIO_USE_SSL`: **false**: Minio 是否启用 ssl ,仅当 `REPOSITORY_AVATAR_STORE_TYPE``minio` 时有效。
191+
- `REPOSITORY_AVATAR_STORAGE_TYPE`: **local**: 仓库头像存储类型,可以为 `local``minio`,分别支持本地文件系统和 minio 兼容的API。
192+
- `REPOSITORY_AVATAR_UPLOAD_PATH`: **data/repo-avatars**: 存储仓库头像的路径。
209193
- `REPOSITORY_AVATAR_FALLBACK`: **none**: 当头像丢失时的处理方式
210194
- none = 不显示头像
211195
- random = 显示随机生成的头像

integrations/mysql.ini.tmpl

Lines changed: 12 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -88,27 +88,18 @@ ENABLE_NOTIFY_MAIL = true
8888
DISABLE_GRAVATAR = true
8989
ENABLE_FEDERATED_AVATAR = false
9090

91-
AVATAR_STORE_TYPE = minio
92-
AVATAR_UPLOAD_PATH = integrations/gitea-integration-mysql/data/avatars
93-
AVATAR_SERVE_DIRECT = false
94-
AVATAR_MINIO_ENDPOINT = minio:9000
95-
AVATAR_MINIO_ACCESS_KEY_ID = 123456
96-
AVATAR_MINIO_SECRET_ACCESS_KEY = 12345678
97-
AVATAR_MINIO_BUCKET = gitea
98-
AVATAR_MINIO_LOCATION = us-east-1
99-
AVATAR_MINIO_BASE_PATH = avatars/
100-
AVATAR_MINIO_USE_SSL = false
101-
102-
REPOSITORY_AVATAR_STORE_TYPE = minio
103-
REPOSITORY_AVATAR_UPLOAD_PATH = integrations/gitea-integration-mysql/data/repo-avatars
104-
REPOSITORY_AVATAR_SERVE_DIRECT = false
105-
REPOSITORY_AVATAR_MINIO_ENDPOINT = minio:9000
106-
REPOSITORY_AVATAR_MINIO_ACCESS_KEY_ID = 123456
107-
REPOSITORY_AVATAR_MINIO_SECRET_ACCESS_KEY = 12345678
108-
REPOSITORY_AVATAR_MINIO_BUCKET = gitea
109-
REPOSITORY_AVATAR_MINIO_LOCATION = us-east-1
110-
REPOSITORY_AVATAR_MINIO_BASE_PATH = repo-avatars/
111-
REPOSITORY_AVATAR_MINIO_USE_SSL = false
91+
AVATAR_UPLOAD_PATH = avatars/
92+
REPOSITORY_AVATAR_UPLOAD_PATH = repo-avatars/
93+
94+
[storage]
95+
STORAGE_TYPE = minio
96+
SERVE_DIRECT = false
97+
MINIO_ENDPOINT = minio:9000
98+
MINIO_ACCESS_KEY_ID = 123456
99+
MINIO_SECRET_ACCESS_KEY = 12345678
100+
MINIO_BUCKET = gitea
101+
MINIO_LOCATION = us-east-1
102+
MINIO_USE_SSL = false
112103

113104
[session]
114105
PROVIDER = file

models/repo.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2315,3 +2315,25 @@ func DoctorUserStarNum() (err error) {
23152315

23162316
return
23172317
}
2318+
2319+
// IterateRepository iterate repositories
2320+
func IterateRepository(f func(repo *Repository) error) error {
2321+
var start int
2322+
var batchSize = setting.Database.IterateBufferSize
2323+
for {
2324+
var repos = make([]*Repository, 0, batchSize)
2325+
if err := x.Limit(batchSize, start).Find(&repos); err != nil {
2326+
return err
2327+
}
2328+
if len(repos) == 0 {
2329+
return nil
2330+
}
2331+
start += len(repos)
2332+
2333+
for _, repo := range repos {
2334+
if err := f(repo); err != nil {
2335+
return err
2336+
}
2337+
}
2338+
}
2339+
}

models/repo_avatar.go

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -36,17 +36,13 @@ func (repo *Repository) generateRandomAvatar(e Engine) error {
3636

3737
repo.Avatar = idToString
3838

39-
pr, pw := io.Pipe()
40-
41-
go func() {
42-
defer pw.Close()
43-
if err = png.Encode(pw, img); err != nil {
39+
if err := storage.SaveFrom(storage.RepoAvatars, repo.CustomAvatarRelativePath(), func(w io.Writer) error {
40+
if err := png.Encode(w, img); err != nil {
4441
log.Error("Encode: %v", err)
4542
}
46-
}()
47-
48-
if _, err := storage.Avatars.Save(repo.CustomAvatarRelativePath(), pr); err != nil {
4943
return err
44+
}); err != nil {
45+
return fmt.Errorf("Failed to create dir %s: %v", repo.CustomAvatarRelativePath(), err)
5046
}
5147

5248
log.Info("New random avatar created for repository: %d", repo.ID)
@@ -147,15 +143,12 @@ func (repo *Repository) UploadAvatar(data []byte) error {
147143
return fmt.Errorf("UploadAvatar: Update repository avatar: %v", err)
148144
}
149145

150-
pr, pw := io.Pipe()
151-
go func() {
152-
defer pw.Close()
153-
if err := png.Encode(pw, *m); err != nil {
146+
if err := storage.SaveFrom(storage.RepoAvatars, repo.CustomAvatarRelativePath(), func(w io.Writer) error {
147+
if err := png.Encode(w, *m); err != nil {
154148
log.Error("Encode: %v", err)
155149
}
156-
}()
157-
158-
if _, err := storage.RepoAvatars.Save(repo.CustomAvatarRelativePath(), pr); err != nil {
150+
return err
151+
}); err != nil {
159152
return fmt.Errorf("UploadAvatar %s failed: Failed to remove old repo avatar %s: %v", repo.RepoPath(), newAvatar, err)
160153
}
161154

@@ -195,25 +188,3 @@ func (repo *Repository) DeleteAvatar() error {
195188

196189
return sess.Commit()
197190
}
198-
199-
// IterateRepository iterate repositories
200-
func IterateRepository(f func(repo *Repository) error) error {
201-
var start int
202-
const batchSize = 100
203-
for {
204-
var repos = make([]*Repository, 0, batchSize)
205-
if err := x.Limit(batchSize, start).Find(&repos); err != nil {
206-
return err
207-
}
208-
if len(repos) == 0 {
209-
return nil
210-
}
211-
start += len(repos)
212-
213-
for _, repo := range repos {
214-
if err := f(repo); err != nil {
215-
return err
216-
}
217-
}
218-
}
219-
}

models/user.go

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1872,3 +1872,25 @@ func SyncExternalUsers(ctx context.Context, updateExisting bool) error {
18721872
}
18731873
return nil
18741874
}
1875+
1876+
// IterateUser iterate users
1877+
func IterateUser(f func(user *User) error) error {
1878+
var start int
1879+
var batchSize = setting.Database.IterateBufferSize
1880+
for {
1881+
var users = make([]*User, 0, batchSize)
1882+
if err := x.Limit(batchSize, start).Find(&users); err != nil {
1883+
return err
1884+
}
1885+
if len(users) == 0 {
1886+
return nil
1887+
}
1888+
start += len(users)
1889+
1890+
for _, user := range users {
1891+
if err := f(user); err != nil {
1892+
return err
1893+
}
1894+
}
1895+
}
1896+
}

models/user_avatar.go

Lines changed: 8 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -45,17 +45,13 @@ func (u *User) generateRandomAvatar(e Engine) error {
4545
u.Avatar = fmt.Sprintf("%d", u.ID)
4646
}
4747

48-
pr, pw := io.Pipe()
49-
50-
go func() {
51-
defer pw.Close()
52-
if err = png.Encode(pw, img); err != nil {
48+
if err := storage.SaveFrom(storage.Avatars, u.CustomAvatarRelativePath(), func(w io.Writer) error {
49+
if err := png.Encode(w, img); err != nil {
5350
log.Error("Encode: %v", err)
5451
}
55-
}()
56-
57-
if _, err := storage.Avatars.Save(u.CustomAvatarRelativePath(), pr); err != nil {
5852
return err
53+
}); err != nil {
54+
return fmt.Errorf("Failed to create dir %s: %v", u.CustomAvatarRelativePath(), err)
5955
}
6056

6157
if _, err := e.ID(u.ID).Cols("avatar").Update(u); err != nil {
@@ -142,15 +138,12 @@ func (u *User) UploadAvatar(data []byte) error {
142138
return fmt.Errorf("updateUser: %v", err)
143139
}
144140

145-
pr, pw := io.Pipe()
146-
go func() {
147-
defer pw.Close()
148-
if err := png.Encode(pw, *m); err != nil {
141+
if err := storage.SaveFrom(storage.Avatars, u.CustomAvatarRelativePath(), func(w io.Writer) error {
142+
if err := png.Encode(w, *m); err != nil {
149143
log.Error("Encode: %v", err)
150144
}
151-
}()
152-
153-
if _, err := storage.Avatars.Save(u.CustomAvatarRelativePath(), pr); err != nil {
145+
return err
146+
}); err != nil {
154147
return fmt.Errorf("Failed to create dir %s: %v", u.CustomAvatarRelativePath(), err)
155148
}
156149

@@ -174,25 +167,3 @@ func (u *User) DeleteAvatar() error {
174167
}
175168
return nil
176169
}
177-
178-
// IterateUser iterate users
179-
func IterateUser(f func(user *User) error) error {
180-
var start int
181-
const batchSize = 100
182-
for {
183-
var users = make([]*User, 0, batchSize)
184-
if err := x.Limit(batchSize, start).Find(&users); err != nil {
185-
return err
186-
}
187-
if len(users) == 0 {
188-
return nil
189-
}
190-
start += len(users)
191-
192-
for _, user := range users {
193-
if err := f(user); err != nil {
194-
return err
195-
}
196-
}
197-
}
198-
}

modules/setting/database.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,8 @@ var (
4747
ConnMaxLifetime time.Duration
4848
IterateBufferSize int
4949
}{
50-
Timeout: 500,
50+
Timeout: 500,
51+
IterateBufferSize: 50,
5152
}
5253
)
5354

modules/storage/storage.go

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,21 @@ func Copy(dstStorage ObjectStorage, dstPath string, srcStorage ObjectStorage, sr
8282
return dstStorage.Save(dstPath, f)
8383
}
8484

85+
// SaveFrom saves data to the ObjectStorage with path p from the callback
86+
func SaveFrom(objStorage ObjectStorage, p string, callback func(w io.Writer) error) error {
87+
pr, pw := io.Pipe()
88+
defer pr.Close()
89+
go func() {
90+
defer pw.Close()
91+
if err := callback(pw); err != nil {
92+
pw.CloseWithError(err)
93+
}
94+
}()
95+
96+
_, err := objStorage.Save(p, pr)
97+
return err
98+
}
99+
85100
var (
86101
// Attachments represents attachments storage
87102
Attachments ObjectStorage

0 commit comments

Comments
 (0)