Skip to content

Commit 5a8dd96

Browse files
authored
Ensure that git daemon export ok is created for mirrors (#17243)
* Ensure that git daemon export ok is created for mirrors There is an issue with #16508 where it appears that create repo requires that the repo does not exist. This causes #17241 where an error is reported because of this. This PR fixes this and also runs update-server-info for mirrors and generated repos. Fix #17241 Signed-off-by: Andrew Thornton <art27@cantab.net>
1 parent 01b9d35 commit 5a8dd96

File tree

7 files changed

+81
-29
lines changed

7 files changed

+81
-29
lines changed

Diff for: models/db/context.go

+8
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,14 @@ type Context struct {
3131
e Engine
3232
}
3333

34+
// WithEngine returns a db.Context from a context.Context and db.Engine
35+
func WithEngine(ctx context.Context, e Engine) *Context {
36+
return &Context{
37+
Context: ctx,
38+
e: e,
39+
}
40+
}
41+
3442
// Engine returns db engine
3543
func (ctx *Context) Engine() Engine {
3644
return ctx.e

Diff for: models/repo.go

+33-26
Original file line numberDiff line numberDiff line change
@@ -1146,16 +1146,6 @@ func CreateRepository(ctx context.Context, doer, u *User, repo *Repository, over
11461146
return fmt.Errorf("recalculateAccesses: %v", err)
11471147
}
11481148

1149-
if u.Visibility == api.VisibleTypePublic && !repo.IsPrivate {
1150-
// Create/Remove git-daemon-export-ok for git-daemon...
1151-
daemonExportFile := path.Join(repo.RepoPath(), `git-daemon-export-ok`)
1152-
if f, err := os.Create(daemonExportFile); err != nil {
1153-
log.Error("Failed to create %s: %v", daemonExportFile, err)
1154-
} else {
1155-
f.Close()
1156-
}
1157-
}
1158-
11591149
if setting.Service.AutoWatchNewRepos {
11601150
if err = watchRepo(db.GetEngine(ctx), doer.ID, repo.ID, true); err != nil {
11611151
return fmt.Errorf("watchRepo: %v", err)
@@ -1169,6 +1159,38 @@ func CreateRepository(ctx context.Context, doer, u *User, repo *Repository, over
11691159
return nil
11701160
}
11711161

1162+
// CheckDaemonExportOK creates/removes git-daemon-export-ok for git-daemon...
1163+
func (repo *Repository) CheckDaemonExportOK(ctx context.Context) error {
1164+
e := db.GetEngine(ctx)
1165+
if err := repo.getOwner(e); err != nil {
1166+
return err
1167+
}
1168+
1169+
// Create/Remove git-daemon-export-ok for git-daemon...
1170+
daemonExportFile := path.Join(repo.RepoPath(), `git-daemon-export-ok`)
1171+
1172+
isExist, err := util.IsExist(daemonExportFile)
1173+
if err != nil {
1174+
log.Error("Unable to check if %s exists. Error: %v", daemonExportFile, err)
1175+
return err
1176+
}
1177+
1178+
isPublic := !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePublic
1179+
if !isPublic && isExist {
1180+
if err = util.Remove(daemonExportFile); err != nil {
1181+
log.Error("Failed to remove %s: %v", daemonExportFile, err)
1182+
}
1183+
} else if isPublic && !isExist {
1184+
if f, err := os.Create(daemonExportFile); err != nil {
1185+
log.Error("Failed to create %s: %v", daemonExportFile, err)
1186+
} else {
1187+
f.Close()
1188+
}
1189+
}
1190+
1191+
return nil
1192+
}
1193+
11721194
func countRepositories(userID int64, private bool) int64 {
11731195
sess := db.GetEngine(db.DefaultContext).Where("id > 0")
11741196

@@ -1318,24 +1340,9 @@ func updateRepository(e db.Engine, repo *Repository, visibilityChanged bool) (er
13181340
}
13191341

13201342
// Create/Remove git-daemon-export-ok for git-daemon...
1321-
daemonExportFile := path.Join(repo.RepoPath(), `git-daemon-export-ok`)
1322-
isExist, err := util.IsExist(daemonExportFile)
1323-
isPublic := !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePublic
1324-
if err != nil {
1325-
log.Error("Unable to check if %s exists. Error: %v", daemonExportFile, err)
1343+
if err := repo.CheckDaemonExportOK(db.WithEngine(db.DefaultContext, e)); err != nil {
13261344
return err
13271345
}
1328-
if !isPublic && isExist {
1329-
if err = util.Remove(daemonExportFile); err != nil {
1330-
log.Error("Failed to remove %s: %v", daemonExportFile, err)
1331-
}
1332-
} else if isPublic && !isExist {
1333-
if f, err := os.Create(daemonExportFile); err != nil {
1334-
log.Error("Failed to create %s: %v", daemonExportFile, err)
1335-
} else {
1336-
f.Close()
1337-
}
1338-
}
13391346

13401347
forkRepos, err := getRepositoriesByForkID(e, repo.ID)
13411348
if err != nil {

Diff for: modules/repository/adopt.go

+3
Original file line numberDiff line numberDiff line change
@@ -68,6 +68,9 @@ func AdoptRepository(doer, u *models.User, opts models.CreateRepoOptions) (*mode
6868
if err := adoptRepository(ctx, repoPath, doer, repo, opts); err != nil {
6969
return fmt.Errorf("createDelegateHooks: %v", err)
7070
}
71+
if err := repo.CheckDaemonExportOK(ctx); err != nil {
72+
return fmt.Errorf("checkDaemonExportOK: %v", err)
73+
}
7174

7275
// Initialize Issue Labels if selected
7376
if len(opts.IssueLabels) > 0 {

Diff for: modules/repository/create.go

+5-1
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,11 @@ func CreateRepository(doer, u *models.User, opts models.CreateRepoOptions) (*mod
105105
}
106106
}
107107

108-
if stdout, err := git.NewCommand("update-server-info").
108+
if err := repo.CheckDaemonExportOK(ctx); err != nil {
109+
return fmt.Errorf("checkDaemonExportOK: %v", err)
110+
}
111+
112+
if stdout, err := git.NewCommandContext(ctx, "update-server-info").
109113
SetDescription(fmt.Sprintf("CreateRepository(git update-server-info): %s", repoPath)).
110114
RunInDir(repoPath); err != nil {
111115
log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)

Diff for: modules/repository/fork.go

+6-2
Original file line numberDiff line numberDiff line change
@@ -97,15 +97,19 @@ func ForkRepository(doer, owner *models.User, opts models.ForkRepoOptions) (_ *m
9797
needsRollback = true
9898

9999
repoPath := models.RepoPath(owner.Name, repo.Name)
100-
if stdout, err := git.NewCommand(
100+
if stdout, err := git.NewCommandContext(ctx,
101101
"clone", "--bare", oldRepoPath, repoPath).
102102
SetDescription(fmt.Sprintf("ForkRepository(git clone): %s to %s", opts.BaseRepo.FullName(), repo.FullName())).
103103
RunInDirTimeout(10*time.Minute, ""); err != nil {
104104
log.Error("Fork Repository (git clone) Failed for %v (from %v):\nStdout: %s\nError: %v", repo, opts.BaseRepo, stdout, err)
105105
return fmt.Errorf("git clone: %v", err)
106106
}
107107

108-
if stdout, err := git.NewCommand("update-server-info").
108+
if err := repo.CheckDaemonExportOK(ctx); err != nil {
109+
return fmt.Errorf("checkDaemonExportOK: %v", err)
110+
}
111+
112+
if stdout, err := git.NewCommandContext(ctx, "update-server-info").
109113
SetDescription(fmt.Sprintf("ForkRepository(git update-server-info): %s", repo.FullName())).
110114
RunInDir(repoPath); err != nil {
111115
log.Error("Fork Repository (git update-server-info) failed for %v:\nStdout: %s\nError: %v", repo, stdout, err)

Diff for: modules/repository/generate.go

+11
Original file line numberDiff line numberDiff line change
@@ -275,5 +275,16 @@ func GenerateRepository(ctx context.Context, doer, owner *models.User, templateR
275275
return generateRepo, err
276276
}
277277

278+
if err = generateRepo.CheckDaemonExportOK(ctx); err != nil {
279+
return generateRepo, fmt.Errorf("checkDaemonExportOK: %v", err)
280+
}
281+
282+
if stdout, err := git.NewCommandContext(ctx, "update-server-info").
283+
SetDescription(fmt.Sprintf("GenerateRepository(git update-server-info): %s", repoPath)).
284+
RunInDir(repoPath); err != nil {
285+
log.Error("GenerateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", generateRepo, stdout, err)
286+
return generateRepo, fmt.Errorf("error in GenerateRepository(git update-server-info): %v", err)
287+
}
288+
278289
return generateRepo, nil
279290
}

Diff for: modules/repository/repo.go

+15
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,21 @@ func MigrateRepositoryGitData(ctx context.Context, u *models.User, repo *models.
9696
}
9797
}
9898

99+
if repo.OwnerID == u.ID {
100+
repo.Owner = u
101+
}
102+
103+
if err = repo.CheckDaemonExportOK(ctx); err != nil {
104+
return repo, fmt.Errorf("checkDaemonExportOK: %v", err)
105+
}
106+
107+
if stdout, err := git.NewCommandContext(ctx, "update-server-info").
108+
SetDescription(fmt.Sprintf("MigrateRepositoryGitData(git update-server-info): %s", repoPath)).
109+
RunInDir(repoPath); err != nil {
110+
log.Error("MigrateRepositoryGitData(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
111+
return repo, fmt.Errorf("error in MigrateRepositoryGitData(git update-server-info): %v", err)
112+
}
113+
99114
gitRepo, err := git.OpenRepository(repoPath)
100115
if err != nil {
101116
return repo, fmt.Errorf("OpenRepository: %v", err)

0 commit comments

Comments
 (0)