Skip to content

Commit 1ce4fb2

Browse files
authored
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>
1 parent 9f02d1c commit 1ce4fb2

File tree

2 files changed

+86
-2
lines changed

2 files changed

+86
-2
lines changed

models/repo.go

+13-2
Original file line numberDiff line numberDiff line change
@@ -1152,6 +1152,16 @@ func CreateRepository(ctx DBContext, doer, u *User, repo *Repository, overwriteO
11521152
return fmt.Errorf("recalculateAccesses: %v", err)
11531153
}
11541154

1155+
if u.Visibility == api.VisibleTypePublic && !repo.IsPrivate {
1156+
// Create/Remove git-daemon-export-ok for git-daemon...
1157+
daemonExportFile := path.Join(repo.RepoPath(), `git-daemon-export-ok`)
1158+
if f, err := os.Create(daemonExportFile); err != nil {
1159+
log.Error("Failed to create %s: %v", daemonExportFile, err)
1160+
} else {
1161+
f.Close()
1162+
}
1163+
}
1164+
11551165
if setting.Service.AutoWatchNewRepos {
11561166
if err = watchRepo(ctx.e, doer.ID, repo.ID, true); err != nil {
11571167
return fmt.Errorf("watchRepo: %v", err)
@@ -1310,15 +1320,16 @@ func updateRepository(e Engine, repo *Repository, visibilityChanged bool) (err e
13101320
// Create/Remove git-daemon-export-ok for git-daemon...
13111321
daemonExportFile := path.Join(repo.RepoPath(), `git-daemon-export-ok`)
13121322
isExist, err := util.IsExist(daemonExportFile)
1323+
isPublic := !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePublic
13131324
if err != nil {
13141325
log.Error("Unable to check if %s exists. Error: %v", daemonExportFile, err)
13151326
return err
13161327
}
1317-
if repo.IsPrivate && isExist {
1328+
if !isPublic && isExist {
13181329
if err = util.Remove(daemonExportFile); err != nil {
13191330
log.Error("Failed to remove %s: %v", daemonExportFile, err)
13201331
}
1321-
} else if !repo.IsPrivate && !isExist {
1332+
} else if isPublic && !isExist {
13221333
if f, err := os.Create(daemonExportFile); err != nil {
13231334
log.Error("Failed to create %s: %v", daemonExportFile, err)
13241335
} else {

modules/doctor/misc.go

+73
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,19 @@ package doctor
66

77
import (
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 {
7580
func 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+
117183
func 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

Comments
 (0)