@@ -6,14 +6,19 @@ package doctor
6
6
7
7
import (
8
8
"fmt"
9
+ "os"
9
10
"os/exec"
11
+ "path"
10
12
"strings"
11
13
12
14
"code.gitea.io/gitea/models"
13
15
"code.gitea.io/gitea/modules/git"
14
16
"code.gitea.io/gitea/modules/log"
15
17
"code.gitea.io/gitea/modules/repository"
16
18
"code.gitea.io/gitea/modules/setting"
19
+ "code.gitea.io/gitea/modules/structs"
20
+ "code.gitea.io/gitea/modules/util"
21
+ lru "github.com/hashicorp/golang-lru"
17
22
"xorm.io/builder"
18
23
)
19
24
@@ -75,6 +80,7 @@ func checkUserStarNum(logger log.Logger, autofix bool) error {
75
80
func checkEnablePushOptions (logger log.Logger , autofix bool ) error {
76
81
numRepos := 0
77
82
numNeedUpdate := 0
83
+
78
84
if err := iterateRepositories (func (repo * models.Repository ) error {
79
85
numRepos ++
80
86
r , err := git .OpenRepository (repo .RepoPath ())
@@ -114,6 +120,66 @@ func checkEnablePushOptions(logger log.Logger, autofix bool) error {
114
120
return nil
115
121
}
116
122
123
+ func checkDaemonExport (logger log.Logger , autofix bool ) error {
124
+ numRepos := 0
125
+ numNeedUpdate := 0
126
+ cache , err := lru .New (512 )
127
+ if err != nil {
128
+ logger .Critical ("Unable to create cache: %v" , err )
129
+ return err
130
+ }
131
+ if err := iterateRepositories (func (repo * models.Repository ) error {
132
+ numRepos ++
133
+
134
+ if owner , has := cache .Get (repo .OwnerID ); has {
135
+ repo .Owner = owner .(* models.User )
136
+ } else {
137
+ if err := repo .GetOwner (); err != nil {
138
+ return err
139
+ }
140
+ cache .Add (repo .OwnerID , repo .Owner )
141
+ }
142
+
143
+ // Create/Remove git-daemon-export-ok for git-daemon...
144
+ daemonExportFile := path .Join (repo .RepoPath (), `git-daemon-export-ok` )
145
+ isExist , err := util .IsExist (daemonExportFile )
146
+ if err != nil {
147
+ log .Error ("Unable to check if %s exists. Error: %v" , daemonExportFile , err )
148
+ return err
149
+ }
150
+ isPublic := ! repo .IsPrivate && repo .Owner .Visibility == structs .VisibleTypePublic
151
+
152
+ if isPublic != isExist {
153
+ numNeedUpdate ++
154
+ if autofix {
155
+ if ! isPublic && isExist {
156
+ if err = util .Remove (daemonExportFile ); err != nil {
157
+ log .Error ("Failed to remove %s: %v" , daemonExportFile , err )
158
+ }
159
+ } else if isPublic && ! isExist {
160
+ if f , err := os .Create (daemonExportFile ); err != nil {
161
+ log .Error ("Failed to create %s: %v" , daemonExportFile , err )
162
+ } else {
163
+ f .Close ()
164
+ }
165
+ }
166
+ }
167
+ }
168
+ return nil
169
+ }); err != nil {
170
+ logger .Critical ("Unable to checkDaemonExport: %v" , err )
171
+ return err
172
+ }
173
+
174
+ if autofix {
175
+ logger .Info ("Updated git-daemon-export-ok files for %d of %d repositories." , numNeedUpdate , numRepos )
176
+ } else {
177
+ logger .Info ("Checked %d repositories, %d need updates." , numRepos , numNeedUpdate )
178
+ }
179
+
180
+ return nil
181
+ }
182
+
117
183
func init () {
118
184
Register (& Check {
119
185
Title : "Check if SCRIPT_TYPE is available" ,
@@ -143,4 +209,11 @@ func init() {
143
209
Run : checkEnablePushOptions ,
144
210
Priority : 7 ,
145
211
})
212
+ Register (& Check {
213
+ Title : "Check git-daemon-export-ok files" ,
214
+ Name : "check-git-daemon-export-ok" ,
215
+ IsDefault : false ,
216
+ Run : checkDaemonExport ,
217
+ Priority : 8 ,
218
+ })
146
219
}
0 commit comments