aboutsummaryrefslogtreecommitdiffstats
path: root/modules/doctor/misc.go
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2021-07-22 12:53:54 +0100
committerGitHub <noreply@github.com>2021-07-22 12:53:54 +0100
commit1ce4fb256f43bb82c3b78a1cd7de87cc32690dc1 (patch)
tree9e994f7268b73d998f47ee2dc38626662c48c54b /modules/doctor/misc.go
parent9f02d1c3c00aef53cad7acdc51d861656edfbffd (diff)
downloadgitea-1ce4fb256f43bb82c3b78a1cd7de87cc32690dc1.tar.gz
gitea-1ce4fb256f43bb82c3b78a1cd7de87cc32690dc1.zip
Restore creation of git-daemon-export-ok files (#16508)
Somewhere along the line the creation of git-daemon-export-ok files disappeared but the updating of these files when repo visibility changes remained. The problem is that the current state will create files even when the org or user is private. This PR restores creation correctly. Fix #15521 Signed-off-by: Andrew Thornton <art27@cantab.net>
Diffstat (limited to 'modules/doctor/misc.go')
-rw-r--r--modules/doctor/misc.go73
1 files changed, 73 insertions, 0 deletions
diff --git a/modules/doctor/misc.go b/modules/doctor/misc.go
index 0ca1e841ee..47fee8f7fd 100644
--- a/modules/doctor/misc.go
+++ b/modules/doctor/misc.go
@@ -6,7 +6,9 @@ package doctor
import (
"fmt"
+ "os"
"os/exec"
+ "path"
"strings"
"code.gitea.io/gitea/models"
@@ -14,6 +16,9 @@ import (
"code.gitea.io/gitea/modules/log"
"code.gitea.io/gitea/modules/repository"
"code.gitea.io/gitea/modules/setting"
+ "code.gitea.io/gitea/modules/structs"
+ "code.gitea.io/gitea/modules/util"
+ lru "github.com/hashicorp/golang-lru"
"xorm.io/builder"
)
@@ -75,6 +80,7 @@ func checkUserStarNum(logger log.Logger, autofix bool) error {
func checkEnablePushOptions(logger log.Logger, autofix bool) error {
numRepos := 0
numNeedUpdate := 0
+
if err := iterateRepositories(func(repo *models.Repository) error {
numRepos++
r, err := git.OpenRepository(repo.RepoPath())
@@ -114,6 +120,66 @@ func checkEnablePushOptions(logger log.Logger, autofix bool) error {
return nil
}
+func checkDaemonExport(logger log.Logger, autofix bool) error {
+ numRepos := 0
+ numNeedUpdate := 0
+ cache, err := lru.New(512)
+ if err != nil {
+ logger.Critical("Unable to create cache: %v", err)
+ return err
+ }
+ if err := iterateRepositories(func(repo *models.Repository) error {
+ numRepos++
+
+ if owner, has := cache.Get(repo.OwnerID); has {
+ repo.Owner = owner.(*models.User)
+ } else {
+ if err := repo.GetOwner(); err != nil {
+ return err
+ }
+ cache.Add(repo.OwnerID, repo.Owner)
+ }
+
+ // Create/Remove git-daemon-export-ok for git-daemon...
+ daemonExportFile := path.Join(repo.RepoPath(), `git-daemon-export-ok`)
+ isExist, err := util.IsExist(daemonExportFile)
+ if err != nil {
+ log.Error("Unable to check if %s exists. Error: %v", daemonExportFile, err)
+ return err
+ }
+ isPublic := !repo.IsPrivate && repo.Owner.Visibility == structs.VisibleTypePublic
+
+ if isPublic != isExist {
+ numNeedUpdate++
+ if autofix {
+ if !isPublic && isExist {
+ if err = util.Remove(daemonExportFile); err != nil {
+ log.Error("Failed to remove %s: %v", daemonExportFile, err)
+ }
+ } else if isPublic && !isExist {
+ if f, err := os.Create(daemonExportFile); err != nil {
+ log.Error("Failed to create %s: %v", daemonExportFile, err)
+ } else {
+ f.Close()
+ }
+ }
+ }
+ }
+ return nil
+ }); err != nil {
+ logger.Critical("Unable to checkDaemonExport: %v", err)
+ return err
+ }
+
+ if autofix {
+ logger.Info("Updated git-daemon-export-ok files for %d of %d repositories.", numNeedUpdate, numRepos)
+ } else {
+ logger.Info("Checked %d repositories, %d need updates.", numRepos, numNeedUpdate)
+ }
+
+ return nil
+}
+
func init() {
Register(&Check{
Title: "Check if SCRIPT_TYPE is available",
@@ -143,4 +209,11 @@ func init() {
Run: checkEnablePushOptions,
Priority: 7,
})
+ Register(&Check{
+ Title: "Check git-daemon-export-ok files",
+ Name: "check-git-daemon-export-ok",
+ IsDefault: false,
+ Run: checkDaemonExport,
+ Priority: 8,
+ })
}