mirror of
https://codeberg.org/forgejo/forgejo.git
synced 2024-12-27 23:34:03 +01:00
Refactor Pull Mirror and fix out-of-sync bugs (#24732)
The "mirror" table and "repository" table might be out-of-sync in some cases. It means that "IsMirror=true" but "Mirror=nil" This PR removes unnecessary "Mirror" field, rename "Mirror" to "PullMirror" and fix nil panic bug. Screenshot of changed templates: ![image](https://github.com/go-gitea/gitea/assets/2114189/c0f2bdfc-5911-43ea-b989-b19619de4235) ![image](https://github.com/go-gitea/gitea/assets/2114189/1078b41a-484f-4c06-8c2f-edb9e658275d)
This commit is contained in:
parent
b9fad73e9f
commit
99283415bc
6 changed files with 45 additions and 33 deletions
|
@ -149,7 +149,7 @@ type Repository struct {
|
||||||
IsEmpty bool `xorm:"INDEX"`
|
IsEmpty bool `xorm:"INDEX"`
|
||||||
IsArchived bool `xorm:"INDEX"`
|
IsArchived bool `xorm:"INDEX"`
|
||||||
IsMirror bool `xorm:"INDEX"`
|
IsMirror bool `xorm:"INDEX"`
|
||||||
*Mirror `xorm:"-"`
|
|
||||||
Status RepositoryStatus `xorm:"NOT NULL DEFAULT 0"`
|
Status RepositoryStatus `xorm:"NOT NULL DEFAULT 0"`
|
||||||
|
|
||||||
RenderingMetas map[string]string `xorm:"-"`
|
RenderingMetas map[string]string `xorm:"-"`
|
||||||
|
|
|
@ -61,7 +61,6 @@ type Repository struct {
|
||||||
RepoLink string
|
RepoLink string
|
||||||
CloneLink repo_model.CloneLink
|
CloneLink repo_model.CloneLink
|
||||||
CommitsCount int64
|
CommitsCount int64
|
||||||
Mirror *repo_model.Mirror
|
|
||||||
|
|
||||||
PullRequest *PullRequest
|
PullRequest *PullRequest
|
||||||
}
|
}
|
||||||
|
@ -380,13 +379,9 @@ func repoAssignment(ctx *Context, repo *repo_model.Repository) {
|
||||||
ctx.Data["Permission"] = &ctx.Repo.Permission
|
ctx.Data["Permission"] = &ctx.Repo.Permission
|
||||||
|
|
||||||
if repo.IsMirror {
|
if repo.IsMirror {
|
||||||
ctx.Repo.Mirror, err = repo_model.GetMirrorByRepoID(ctx, repo.ID)
|
pullMirror, err := repo_model.GetMirrorByRepoID(ctx, repo.ID)
|
||||||
if err == nil {
|
if err == nil {
|
||||||
ctx.Repo.Mirror.Repo = repo
|
ctx.Data["PullMirror"] = pullMirror
|
||||||
ctx.Data["IsPullMirror"] = true
|
|
||||||
ctx.Data["MirrorEnablePrune"] = ctx.Repo.Mirror.EnablePrune
|
|
||||||
ctx.Data["MirrorInterval"] = ctx.Repo.Mirror.Interval
|
|
||||||
ctx.Data["Mirror"] = ctx.Repo.Mirror
|
|
||||||
} else if err != repo_model.ErrMirrorNotExist {
|
} else if err != repo_model.ErrMirrorNotExist {
|
||||||
ctx.ServerError("GetMirrorByRepoID", err)
|
ctx.ServerError("GetMirrorByRepoID", err)
|
||||||
return
|
return
|
||||||
|
|
|
@ -198,6 +198,15 @@ func SettingsPost(ctx *context.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pullMirror, err := repo_model.GetMirrorByRepoID(ctx, ctx.Repo.Repository.ID)
|
||||||
|
if err == repo_model.ErrMirrorNotExist {
|
||||||
|
ctx.NotFound("", nil)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
if err != nil {
|
||||||
|
ctx.ServerError("GetMirrorByRepoID", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
// This section doesn't require repo_name/RepoName to be set in the form, don't show it
|
// This section doesn't require repo_name/RepoName to be set in the form, don't show it
|
||||||
// as an error on the UI for this action
|
// as an error on the UI for this action
|
||||||
ctx.Data["Err_RepoName"] = nil
|
ctx.Data["Err_RepoName"] = nil
|
||||||
|
@ -209,15 +218,15 @@ func SettingsPost(ctx *context.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.Repo.Mirror.EnablePrune = form.EnablePrune
|
pullMirror.EnablePrune = form.EnablePrune
|
||||||
ctx.Repo.Mirror.Interval = interval
|
pullMirror.Interval = interval
|
||||||
ctx.Repo.Mirror.ScheduleNextUpdate()
|
pullMirror.ScheduleNextUpdate()
|
||||||
if err := repo_model.UpdateMirror(ctx, ctx.Repo.Mirror); err != nil {
|
if err := repo_model.UpdateMirror(ctx, pullMirror); err != nil {
|
||||||
ctx.ServerError("UpdateMirror", err)
|
ctx.ServerError("UpdateMirror", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
u, err := git.GetRemoteURL(ctx, ctx.Repo.Repository.RepoPath(), ctx.Repo.Mirror.GetRemoteName())
|
u, err := git.GetRemoteURL(ctx, ctx.Repo.Repository.RepoPath(), pullMirror.GetRemoteName())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
ctx.Data["Err_MirrorAddress"] = true
|
ctx.Data["Err_MirrorAddress"] = true
|
||||||
handleSettingRemoteAddrError(ctx, err, form)
|
handleSettingRemoteAddrError(ctx, err, form)
|
||||||
|
@ -237,7 +246,7 @@ func SettingsPost(ctx *context.Context) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := mirror_service.UpdateAddress(ctx, ctx.Repo.Mirror, address); err != nil {
|
if err := mirror_service.UpdateAddress(ctx, pullMirror, address); err != nil {
|
||||||
ctx.ServerError("UpdateAddress", err)
|
ctx.ServerError("UpdateAddress", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -259,9 +268,9 @@ func SettingsPost(ctx *context.Context) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
ctx.Repo.Mirror.LFS = form.LFS
|
pullMirror.LFS = form.LFS
|
||||||
ctx.Repo.Mirror.LFSEndpoint = form.LFSEndpoint
|
pullMirror.LFSEndpoint = form.LFSEndpoint
|
||||||
if err := repo_model.UpdateMirror(ctx, ctx.Repo.Mirror); err != nil {
|
if err := repo_model.UpdateMirror(ctx, pullMirror); err != nil {
|
||||||
ctx.ServerError("UpdateMirror", err)
|
ctx.ServerError("UpdateMirror", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,11 +124,10 @@ func innerToRepo(ctx context.Context, repo *repo_model.Repository, mode perm.Acc
|
||||||
mirrorInterval := ""
|
mirrorInterval := ""
|
||||||
var mirrorUpdated time.Time
|
var mirrorUpdated time.Time
|
||||||
if repo.IsMirror {
|
if repo.IsMirror {
|
||||||
var err error
|
pullMirror, err := repo_model.GetMirrorByRepoID(ctx, repo.ID)
|
||||||
repo.Mirror, err = repo_model.GetMirrorByRepoID(ctx, repo.ID)
|
|
||||||
if err == nil {
|
if err == nil {
|
||||||
mirrorInterval = repo.Mirror.Interval.String()
|
mirrorInterval = pullMirror.Interval.String()
|
||||||
mirrorUpdated = repo.Mirror.UpdatedUnix.AsTime()
|
mirrorUpdated = pullMirror.UpdatedUnix.AsTime()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,8 @@
|
||||||
<a class="rss-icon gt-ml-3" href="{{$.RepoLink}}.rss" data-tooltip-content="{{$.locale.Tr "rss_feed"}}">{{svg "octicon-rss" 18}}</a>
|
<a class="rss-icon gt-ml-3" href="{{$.RepoLink}}.rss" data-tooltip-content="{{$.locale.Tr "rss_feed"}}">{{svg "octicon-rss" 18}}</a>
|
||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
{{if $.IsPullMirror}}
|
{{if $.PullMirror}}
|
||||||
{{$address := MirrorRemoteAddress $.Context . $.Mirror.GetRemoteName false}}
|
{{$address := MirrorRemoteAddress $.Context . $.PullMirror.GetRemoteName false}}
|
||||||
<div class="fork-flag">{{$.locale.Tr "repo.mirror_from"}} <a target="_blank" rel="noopener noreferrer" href="{{$address.Address}}">{{$address.Address}}</a></div>
|
<div class="fork-flag">{{$.locale.Tr "repo.mirror_from"}} <a target="_blank" rel="noopener noreferrer" href="{{$address.Address}}">{{$address.Address}}</a></div>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if .IsFork}}<div class="fork-flag">{{$.locale.Tr "repo.forked_from"}} <a href="{{.BaseRepo.Link}}">{{.BaseRepo.FullName}}</a></div>{{end}}
|
{{if .IsFork}}<div class="fork-flag">{{$.locale.Tr "repo.forked_from"}} <a href="{{.BaseRepo.Link}}">{{.BaseRepo.FullName}}</a></div>{{end}}
|
||||||
|
|
|
@ -84,12 +84,21 @@
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{if .Repository.IsMirror}}
|
{{if and .Repository.IsMirror (not .PullMirror)}}
|
||||||
|
{{/* even if a repo is a pull mirror (IsMirror=true), the PullMirror might still be nil if the mirror migration is broken */}}
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr>
|
<tr>
|
||||||
<td>{{(MirrorRemoteAddress $.Context .Repository .Mirror.GetRemoteName false).Address}}</td>
|
<td colspan="4">
|
||||||
|
<span class="text red gt-db gt-py-4 gt-border-secondary-bottom">{{$.locale.Tr "repo.settings.mirror_settings.direction.pull"}}: {{$.locale.Tr "error.occurred"}}</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
{{else if .PullMirror}}
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td>{{(MirrorRemoteAddress $.Context .Repository .PullMirror.GetRemoteName false).Address}}</td>
|
||||||
<td>{{$.locale.Tr "repo.settings.mirror_settings.direction.pull"}}</td>
|
<td>{{$.locale.Tr "repo.settings.mirror_settings.direction.pull"}}</td>
|
||||||
<td>{{DateTime "full" .Mirror.UpdatedUnix}}</td>
|
<td>{{DateTime "full" .PullMirror.UpdatedUnix}}</td>
|
||||||
<td class="right aligned">
|
<td class="right aligned">
|
||||||
<form method="post" class="gt-dib">
|
<form method="post" class="gt-dib">
|
||||||
{{.CsrfTokenHtml}}
|
{{.CsrfTokenHtml}}
|
||||||
|
@ -107,15 +116,15 @@
|
||||||
<div class="inline field {{if .Err_EnablePrune}}error{{end}}">
|
<div class="inline field {{if .Err_EnablePrune}}error{{end}}">
|
||||||
<label>{{.locale.Tr "repo.mirror_prune"}}</label>
|
<label>{{.locale.Tr "repo.mirror_prune"}}</label>
|
||||||
<div class="ui checkbox">
|
<div class="ui checkbox">
|
||||||
<input id="enable_prune" name="enable_prune" type="checkbox" {{if .MirrorEnablePrune}}checked{{end}}>
|
<input id="enable_prune" name="enable_prune" type="checkbox" {{if .PullMirror.EnablePrune}}checked{{end}}>
|
||||||
<label>{{.locale.Tr "repo.mirror_prune_desc"}}</label>
|
<label>{{.locale.Tr "repo.mirror_prune_desc"}}</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="inline field {{if .Err_Interval}}error{{end}}">
|
<div class="inline field {{if .Err_Interval}}error{{end}}">
|
||||||
<label for="interval">{{.locale.Tr "repo.mirror_interval" .MinimumMirrorInterval}}</label>
|
<label for="interval">{{.locale.Tr "repo.mirror_interval" .MinimumMirrorInterval}}</label>
|
||||||
<input id="interval" name="interval" value="{{.MirrorInterval}}">
|
<input id="interval" name="interval" value="{{.PullMirror.Interval}}">
|
||||||
</div>
|
</div>
|
||||||
{{$address := MirrorRemoteAddress $.Context .Repository .Mirror.GetRemoteName false}}
|
{{$address := MirrorRemoteAddress $.Context .Repository .PullMirror.GetRemoteName false}}
|
||||||
<div class="field {{if .Err_MirrorAddress}}error{{end}}">
|
<div class="field {{if .Err_MirrorAddress}}error{{end}}">
|
||||||
<label for="mirror_address">{{.locale.Tr "repo.mirror_address"}}</label>
|
<label for="mirror_address">{{.locale.Tr "repo.mirror_address"}}</label>
|
||||||
<input id="mirror_address" name="mirror_address" value="{{$address.Address}}" required>
|
<input id="mirror_address" name="mirror_address" value="{{$address.Address}}" required>
|
||||||
|
@ -142,13 +151,13 @@
|
||||||
<div class="inline field">
|
<div class="inline field">
|
||||||
<label>{{.locale.Tr "repo.mirror_lfs"}}</label>
|
<label>{{.locale.Tr "repo.mirror_lfs"}}</label>
|
||||||
<div class="ui checkbox">
|
<div class="ui checkbox">
|
||||||
<input id="mirror_lfs" name="mirror_lfs" type="checkbox" {{if .Mirror.LFS}}checked{{end}}>
|
<input id="mirror_lfs" name="mirror_lfs" type="checkbox" {{if .PullMirror.LFS}}checked{{end}}>
|
||||||
<label>{{.locale.Tr "repo.mirror_lfs_desc"}}</label>
|
<label>{{.locale.Tr "repo.mirror_lfs_desc"}}</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="field {{if .Err_LFSEndpoint}}error{{end}}">
|
<div class="field {{if .Err_LFSEndpoint}}error{{end}}">
|
||||||
<label for="mirror_lfs_endpoint">{{.locale.Tr "repo.mirror_lfs_endpoint"}}</label>
|
<label for="mirror_lfs_endpoint">{{.locale.Tr "repo.mirror_lfs_endpoint"}}</label>
|
||||||
<input id="mirror_lfs_endpoint" name="mirror_lfs_endpoint" value="{{.Mirror.LFSEndpoint}}" placeholder="{{.locale.Tr "repo.migrate_options_lfs_endpoint.placeholder"}}">
|
<input id="mirror_lfs_endpoint" name="mirror_lfs_endpoint" value="{{.PullMirror.LFSEndpoint}}" placeholder="{{.locale.Tr "repo.migrate_options_lfs_endpoint.placeholder"}}">
|
||||||
<p class="help">{{.locale.Tr "repo.mirror_lfs_endpoint_desc" "https://github.com/git-lfs/git-lfs/blob/main/docs/api/server-discovery.md#server-discovery" | Str2html}}</p>
|
<p class="help">{{.locale.Tr "repo.mirror_lfs_endpoint_desc" "https://github.com/git-lfs/git-lfs/blob/main/docs/api/server-discovery.md#server-discovery" | Str2html}}</p>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
@ -160,7 +169,7 @@
|
||||||
</tr>
|
</tr>
|
||||||
</tbody>
|
</tbody>
|
||||||
<thead><tr><th colspan="4"></th></tr></thead>
|
<thead><tr><th colspan="4"></th></tr></thead>
|
||||||
{{end}}
|
{{end}}{{/* end if: IsMirror */}}
|
||||||
<tbody>
|
<tbody>
|
||||||
{{range .PushMirrors}}
|
{{range .PushMirrors}}
|
||||||
<tr>
|
<tr>
|
||||||
|
|
Loading…
Reference in a new issue