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>
This commit is contained in:
parent
01b9d35f1a
commit
5a8dd96b33
7 changed files with 81 additions and 29 deletions
|
@ -31,6 +31,14 @@ type Context struct {
|
||||||
e Engine
|
e Engine
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// WithEngine returns a db.Context from a context.Context and db.Engine
|
||||||
|
func WithEngine(ctx context.Context, e Engine) *Context {
|
||||||
|
return &Context{
|
||||||
|
Context: ctx,
|
||||||
|
e: e,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Engine returns db engine
|
// Engine returns db engine
|
||||||
func (ctx *Context) Engine() Engine {
|
func (ctx *Context) Engine() Engine {
|
||||||
return ctx.e
|
return ctx.e
|
||||||
|
|
|
@ -1146,16 +1146,6 @@ func CreateRepository(ctx context.Context, doer, u *User, repo *Repository, over
|
||||||
return fmt.Errorf("recalculateAccesses: %v", err)
|
return fmt.Errorf("recalculateAccesses: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if u.Visibility == api.VisibleTypePublic && !repo.IsPrivate {
|
|
||||||
// Create/Remove git-daemon-export-ok for git-daemon...
|
|
||||||
daemonExportFile := path.Join(repo.RepoPath(), `git-daemon-export-ok`)
|
|
||||||
if f, err := os.Create(daemonExportFile); err != nil {
|
|
||||||
log.Error("Failed to create %s: %v", daemonExportFile, err)
|
|
||||||
} else {
|
|
||||||
f.Close()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if setting.Service.AutoWatchNewRepos {
|
if setting.Service.AutoWatchNewRepos {
|
||||||
if err = watchRepo(db.GetEngine(ctx), doer.ID, repo.ID, true); err != nil {
|
if err = watchRepo(db.GetEngine(ctx), doer.ID, repo.ID, true); err != nil {
|
||||||
return fmt.Errorf("watchRepo: %v", err)
|
return fmt.Errorf("watchRepo: %v", err)
|
||||||
|
@ -1169,6 +1159,38 @@ func CreateRepository(ctx context.Context, doer, u *User, repo *Repository, over
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// CheckDaemonExportOK creates/removes git-daemon-export-ok for git-daemon...
|
||||||
|
func (repo *Repository) CheckDaemonExportOK(ctx context.Context) error {
|
||||||
|
e := db.GetEngine(ctx)
|
||||||
|
if err := repo.getOwner(e); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// 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 == api.VisibleTypePublic
|
||||||
|
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
|
||||||
|
}
|
||||||
|
|
||||||
func countRepositories(userID int64, private bool) int64 {
|
func countRepositories(userID int64, private bool) int64 {
|
||||||
sess := db.GetEngine(db.DefaultContext).Where("id > 0")
|
sess := db.GetEngine(db.DefaultContext).Where("id > 0")
|
||||||
|
|
||||||
|
@ -1318,24 +1340,9 @@ func updateRepository(e db.Engine, repo *Repository, visibilityChanged bool) (er
|
||||||
}
|
}
|
||||||
|
|
||||||
// Create/Remove git-daemon-export-ok for git-daemon...
|
// Create/Remove git-daemon-export-ok for git-daemon...
|
||||||
daemonExportFile := path.Join(repo.RepoPath(), `git-daemon-export-ok`)
|
if err := repo.CheckDaemonExportOK(db.WithEngine(db.DefaultContext, e)); err != nil {
|
||||||
isExist, err := util.IsExist(daemonExportFile)
|
|
||||||
isPublic := !repo.IsPrivate && repo.Owner.Visibility == api.VisibleTypePublic
|
|
||||||
if err != nil {
|
|
||||||
log.Error("Unable to check if %s exists. Error: %v", daemonExportFile, err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
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()
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
forkRepos, err := getRepositoriesByForkID(e, repo.ID)
|
forkRepos, err := getRepositoriesByForkID(e, repo.ID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
@ -68,6 +68,9 @@ func AdoptRepository(doer, u *models.User, opts models.CreateRepoOptions) (*mode
|
||||||
if err := adoptRepository(ctx, repoPath, doer, repo, opts); err != nil {
|
if err := adoptRepository(ctx, repoPath, doer, repo, opts); err != nil {
|
||||||
return fmt.Errorf("createDelegateHooks: %v", err)
|
return fmt.Errorf("createDelegateHooks: %v", err)
|
||||||
}
|
}
|
||||||
|
if err := repo.CheckDaemonExportOK(ctx); err != nil {
|
||||||
|
return fmt.Errorf("checkDaemonExportOK: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
// Initialize Issue Labels if selected
|
// Initialize Issue Labels if selected
|
||||||
if len(opts.IssueLabels) > 0 {
|
if len(opts.IssueLabels) > 0 {
|
||||||
|
|
|
@ -105,7 +105,11 @@ func CreateRepository(doer, u *models.User, opts models.CreateRepoOptions) (*mod
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if stdout, err := git.NewCommand("update-server-info").
|
if err := repo.CheckDaemonExportOK(ctx); err != nil {
|
||||||
|
return fmt.Errorf("checkDaemonExportOK: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if stdout, err := git.NewCommandContext(ctx, "update-server-info").
|
||||||
SetDescription(fmt.Sprintf("CreateRepository(git update-server-info): %s", repoPath)).
|
SetDescription(fmt.Sprintf("CreateRepository(git update-server-info): %s", repoPath)).
|
||||||
RunInDir(repoPath); err != nil {
|
RunInDir(repoPath); err != nil {
|
||||||
log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
|
log.Error("CreateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
|
||||||
|
|
|
@ -97,7 +97,7 @@ func ForkRepository(doer, owner *models.User, opts models.ForkRepoOptions) (_ *m
|
||||||
needsRollback = true
|
needsRollback = true
|
||||||
|
|
||||||
repoPath := models.RepoPath(owner.Name, repo.Name)
|
repoPath := models.RepoPath(owner.Name, repo.Name)
|
||||||
if stdout, err := git.NewCommand(
|
if stdout, err := git.NewCommandContext(ctx,
|
||||||
"clone", "--bare", oldRepoPath, repoPath).
|
"clone", "--bare", oldRepoPath, repoPath).
|
||||||
SetDescription(fmt.Sprintf("ForkRepository(git clone): %s to %s", opts.BaseRepo.FullName(), repo.FullName())).
|
SetDescription(fmt.Sprintf("ForkRepository(git clone): %s to %s", opts.BaseRepo.FullName(), repo.FullName())).
|
||||||
RunInDirTimeout(10*time.Minute, ""); err != nil {
|
RunInDirTimeout(10*time.Minute, ""); err != nil {
|
||||||
|
@ -105,7 +105,11 @@ func ForkRepository(doer, owner *models.User, opts models.ForkRepoOptions) (_ *m
|
||||||
return fmt.Errorf("git clone: %v", err)
|
return fmt.Errorf("git clone: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if stdout, err := git.NewCommand("update-server-info").
|
if err := repo.CheckDaemonExportOK(ctx); err != nil {
|
||||||
|
return fmt.Errorf("checkDaemonExportOK: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if stdout, err := git.NewCommandContext(ctx, "update-server-info").
|
||||||
SetDescription(fmt.Sprintf("ForkRepository(git update-server-info): %s", repo.FullName())).
|
SetDescription(fmt.Sprintf("ForkRepository(git update-server-info): %s", repo.FullName())).
|
||||||
RunInDir(repoPath); err != nil {
|
RunInDir(repoPath); err != nil {
|
||||||
log.Error("Fork Repository (git update-server-info) failed for %v:\nStdout: %s\nError: %v", repo, stdout, err)
|
log.Error("Fork Repository (git update-server-info) failed for %v:\nStdout: %s\nError: %v", repo, stdout, err)
|
||||||
|
|
|
@ -275,5 +275,16 @@ func GenerateRepository(ctx context.Context, doer, owner *models.User, templateR
|
||||||
return generateRepo, err
|
return generateRepo, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if err = generateRepo.CheckDaemonExportOK(ctx); err != nil {
|
||||||
|
return generateRepo, fmt.Errorf("checkDaemonExportOK: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if stdout, err := git.NewCommandContext(ctx, "update-server-info").
|
||||||
|
SetDescription(fmt.Sprintf("GenerateRepository(git update-server-info): %s", repoPath)).
|
||||||
|
RunInDir(repoPath); err != nil {
|
||||||
|
log.Error("GenerateRepository(git update-server-info) in %v: Stdout: %s\nError: %v", generateRepo, stdout, err)
|
||||||
|
return generateRepo, fmt.Errorf("error in GenerateRepository(git update-server-info): %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
return generateRepo, nil
|
return generateRepo, nil
|
||||||
}
|
}
|
||||||
|
|
|
@ -96,6 +96,21 @@ func MigrateRepositoryGitData(ctx context.Context, u *models.User, repo *models.
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if repo.OwnerID == u.ID {
|
||||||
|
repo.Owner = u
|
||||||
|
}
|
||||||
|
|
||||||
|
if err = repo.CheckDaemonExportOK(ctx); err != nil {
|
||||||
|
return repo, fmt.Errorf("checkDaemonExportOK: %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
|
if stdout, err := git.NewCommandContext(ctx, "update-server-info").
|
||||||
|
SetDescription(fmt.Sprintf("MigrateRepositoryGitData(git update-server-info): %s", repoPath)).
|
||||||
|
RunInDir(repoPath); err != nil {
|
||||||
|
log.Error("MigrateRepositoryGitData(git update-server-info) in %v: Stdout: %s\nError: %v", repo, stdout, err)
|
||||||
|
return repo, fmt.Errorf("error in MigrateRepositoryGitData(git update-server-info): %v", err)
|
||||||
|
}
|
||||||
|
|
||||||
gitRepo, err := git.OpenRepository(repoPath)
|
gitRepo, err := git.OpenRepository(repoPath)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return repo, fmt.Errorf("OpenRepository: %v", err)
|
return repo, fmt.Errorf("OpenRepository: %v", err)
|
||||||
|
|
Reference in a new issue