@@ -6,14 +6,19 @@ package doctor
66
77import (
88 "fmt"
9+ "os"
910 "os/exec"
11+ "path"
1012 "strings"
1113
1214 "code.gitea.io/gitea/models"
1315 "code.gitea.io/gitea/modules/git"
1416 "code.gitea.io/gitea/modules/log"
1517 "code.gitea.io/gitea/modules/repository"
1618 "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"
1722 "xorm.io/builder"
1823)
1924
@@ -75,6 +80,7 @@ func checkUserStarNum(logger log.Logger, autofix bool) error {
7580func checkEnablePushOptions (logger log.Logger , autofix bool ) error {
7681 numRepos := 0
7782 numNeedUpdate := 0
83+
7884 if err := iterateRepositories (func (repo * models.Repository ) error {
7985 numRepos ++
8086 r , err := git .OpenRepository (repo .RepoPath ())
@@ -114,6 +120,66 @@ func checkEnablePushOptions(logger log.Logger, autofix bool) error {
114120 return nil
115121}
116122
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+
117183func init () {
118184 Register (& Check {
119185 Title : "Check if SCRIPT_TYPE is available" ,
@@ -143,4 +209,11 @@ func init() {
143209 Run : checkEnablePushOptions ,
144210 Priority : 7 ,
145211 })
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+ })
146219}
0 commit comments