mirror of
https://github.com/go-gitea/gitea
synced 2025-01-08 00:44:26 +00:00
parent
2b064b8637
commit
3d544a3ad3
@ -279,6 +279,8 @@ func (repo *Repository) IsBroken() bool {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// MarkAsBrokenEmpty marks the repo as broken and empty
|
// MarkAsBrokenEmpty marks the repo as broken and empty
|
||||||
|
// FIXME: the status "broken" and "is_empty" were abused,
|
||||||
|
// The code always set them together, no way to distinguish whether a repo is really "empty" or "broken"
|
||||||
func (repo *Repository) MarkAsBrokenEmpty() {
|
func (repo *Repository) MarkAsBrokenEmpty() {
|
||||||
repo.Status = RepositoryBroken
|
repo.Status = RepositoryBroken
|
||||||
repo.IsEmpty = true
|
repo.IsEmpty = true
|
||||||
|
@ -1235,6 +1235,7 @@ create_new_repo_command = Creating a new repository on the command line
|
|||||||
push_exist_repo = Pushing an existing repository from the command line
|
push_exist_repo = Pushing an existing repository from the command line
|
||||||
empty_message = This repository does not contain any content.
|
empty_message = This repository does not contain any content.
|
||||||
broken_message = The Git data underlying this repository cannot be read. Contact the administrator of this instance or delete this repository.
|
broken_message = The Git data underlying this repository cannot be read. Contact the administrator of this instance or delete this repository.
|
||||||
|
no_branch = This repository doesn’t have any branches.
|
||||||
|
|
||||||
code = Code
|
code = Code
|
||||||
code.desc = Access source code, files, commits and branches.
|
code.desc = Access source code, files, commits and branches.
|
||||||
|
@ -223,16 +223,37 @@ func prepareRecentlyPushedNewBranches(ctx *context.Context) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func updateContextRepoEmptyAndStatus(ctx *context.Context, empty bool, status repo_model.RepositoryStatus) {
|
||||||
|
ctx.Repo.Repository.IsEmpty = empty
|
||||||
|
if ctx.Repo.Repository.Status == repo_model.RepositoryReady || ctx.Repo.Repository.Status == repo_model.RepositoryBroken {
|
||||||
|
ctx.Repo.Repository.Status = status // only handle ready and broken status, leave other status as-is
|
||||||
|
}
|
||||||
|
if err := repo_model.UpdateRepositoryCols(ctx, ctx.Repo.Repository, "is_empty", "status"); err != nil {
|
||||||
|
ctx.ServerError("updateContextRepoEmptyAndStatus: UpdateRepositoryCols", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func handleRepoEmptyOrBroken(ctx *context.Context) {
|
func handleRepoEmptyOrBroken(ctx *context.Context) {
|
||||||
showEmpty := true
|
showEmpty := true
|
||||||
var err error
|
|
||||||
if ctx.Repo.GitRepo != nil {
|
if ctx.Repo.GitRepo != nil {
|
||||||
showEmpty, err = ctx.Repo.GitRepo.IsEmpty()
|
reallyEmpty, err := ctx.Repo.GitRepo.IsEmpty()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
showEmpty = true // the repo is broken
|
||||||
|
updateContextRepoEmptyAndStatus(ctx, true, repo_model.RepositoryBroken)
|
||||||
log.Error("GitRepo.IsEmpty: %v", err)
|
log.Error("GitRepo.IsEmpty: %v", err)
|
||||||
ctx.Repo.Repository.Status = repo_model.RepositoryBroken
|
|
||||||
showEmpty = true
|
|
||||||
ctx.Flash.Error(ctx.Tr("error.occurred"), true)
|
ctx.Flash.Error(ctx.Tr("error.occurred"), true)
|
||||||
|
} else if reallyEmpty {
|
||||||
|
showEmpty = true // the repo is really empty
|
||||||
|
updateContextRepoEmptyAndStatus(ctx, true, repo_model.RepositoryReady)
|
||||||
|
} else if ctx.Repo.Commit == nil {
|
||||||
|
showEmpty = true // it is not really empty, but there is no branch
|
||||||
|
// at the moment, other repo units like "actions" are not able to handle such case,
|
||||||
|
// so we just mark the repo as empty to prevent from displaying these units.
|
||||||
|
updateContextRepoEmptyAndStatus(ctx, true, repo_model.RepositoryReady)
|
||||||
|
} else {
|
||||||
|
// the repo is actually not empty and has branches, need to update the database later
|
||||||
|
showEmpty = false
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if showEmpty {
|
if showEmpty {
|
||||||
@ -240,18 +261,11 @@ func handleRepoEmptyOrBroken(ctx *context.Context) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
// the repo is not really empty, so we should update the modal in database
|
// The repo is not really empty, so we should update the model in database, such problem may be caused by:
|
||||||
// such problem may be caused by:
|
// 1) an error occurs during pushing/receiving.
|
||||||
// 1) an error occurs during pushing/receiving. 2) the user replaces an empty git repo manually
|
// 2) the user replaces an empty git repo manually.
|
||||||
// and even more: the IsEmpty flag is deeply broken and should be removed with the UI changed to manage to cope with empty repos.
|
updateContextRepoEmptyAndStatus(ctx, false, repo_model.RepositoryReady)
|
||||||
// it's possible for a repository to be non-empty by that flag but still 500
|
if err := repo_module.UpdateRepoSize(ctx, ctx.Repo.Repository); err != nil {
|
||||||
// because there are no branches - only tags -or the default branch is non-extant as it has been 0-pushed.
|
|
||||||
ctx.Repo.Repository.IsEmpty = false
|
|
||||||
if err = repo_model.UpdateRepositoryCols(ctx, ctx.Repo.Repository, "is_empty"); err != nil {
|
|
||||||
ctx.ServerError("UpdateRepositoryCols", err)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
if err = repo_module.UpdateRepoSize(ctx, ctx.Repo.Repository); err != nil {
|
|
||||||
ctx.ServerError("UpdateRepoSize", err)
|
ctx.ServerError("UpdateRepoSize", err)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -897,10 +897,8 @@ func RepoRefByType(detectRefType RepoRefType, opts ...RepoRefByTypeOptions) func
|
|||||||
refName = brs[0].Name
|
refName = brs[0].Name
|
||||||
} else if len(brs) == 0 {
|
} else if len(brs) == 0 {
|
||||||
log.Error("No branches in non-empty repository %s", ctx.Repo.GitRepo.Path)
|
log.Error("No branches in non-empty repository %s", ctx.Repo.GitRepo.Path)
|
||||||
ctx.Repo.Repository.MarkAsBrokenEmpty()
|
|
||||||
} else {
|
} else {
|
||||||
log.Error("GetBranches error: %v", err)
|
log.Error("GetBranches error: %v", err)
|
||||||
ctx.Repo.Repository.MarkAsBrokenEmpty()
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ctx.Repo.RefName = refName
|
ctx.Repo.RefName = refName
|
||||||
@ -911,7 +909,6 @@ func RepoRefByType(detectRefType RepoRefType, opts ...RepoRefByTypeOptions) func
|
|||||||
} else if strings.Contains(err.Error(), "fatal: not a git repository") || strings.Contains(err.Error(), "object does not exist") {
|
} else if strings.Contains(err.Error(), "fatal: not a git repository") || strings.Contains(err.Error(), "object does not exist") {
|
||||||
// if the repository is broken, we can continue to the handler code, to show "Settings -> Delete Repository" for end users
|
// if the repository is broken, we can continue to the handler code, to show "Settings -> Delete Repository" for end users
|
||||||
log.Error("GetBranchCommit: %v", err)
|
log.Error("GetBranchCommit: %v", err)
|
||||||
ctx.Repo.Repository.MarkAsBrokenEmpty()
|
|
||||||
} else {
|
} else {
|
||||||
ctx.ServerError("GetBranchCommit", err)
|
ctx.ServerError("GetBranchCommit", err)
|
||||||
return
|
return
|
||||||
|
@ -14,14 +14,13 @@
|
|||||||
{{end}}
|
{{end}}
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
{{if .Repository.IsBroken}}
|
{{if .Repository.IsBroken}}
|
||||||
<div class="ui segment center">
|
<div class="ui segment center">{{ctx.Locale.Tr "repo.broken_message"}}</div>
|
||||||
{{ctx.Locale.Tr "repo.broken_message"}}
|
{{else if .Repository.IsEmpty}}
|
||||||
</div>
|
<div class="ui segment center">{{ctx.Locale.Tr "repo.no_branch"}}</div>
|
||||||
{{else if .CanWriteCode}}
|
{{else if .CanWriteCode}}
|
||||||
<h4 class="ui top attached header">
|
<h4 class="ui top attached header">{{ctx.Locale.Tr "repo.quick_guide"}}</h4>
|
||||||
{{ctx.Locale.Tr "repo.quick_guide"}}
|
|
||||||
</h4>
|
|
||||||
<div class="ui attached guide table segment empty-repo-guide">
|
<div class="ui attached guide table segment empty-repo-guide">
|
||||||
<div class="item">
|
<div class="item">
|
||||||
<h3>{{ctx.Locale.Tr "repo.clone_this_repo"}} <small>{{ctx.Locale.Tr "repo.clone_helper" "http://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository"}}</small></h3>
|
<h3>{{ctx.Locale.Tr "repo.clone_this_repo"}} <small>{{ctx.Locale.Tr "repo.clone_helper" "http://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository"}}</small></h3>
|
||||||
@ -66,12 +65,10 @@ git push -u origin {{.Repository.DefaultBranch}}</code></pre>
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
{{end}}
|
{{end}}
|
||||||
{{else}}
|
</div>
|
||||||
<div class="ui segment center">
|
{{else}}
|
||||||
{{ctx.Locale.Tr "repo.empty_message"}}
|
<div class="ui segment center">{{ctx.Locale.Tr "repo.empty_message"}}</div>
|
||||||
</div>
|
{{end}}
|
||||||
{{end}}
|
|
||||||
</div>
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
@ -162,7 +162,7 @@
|
|||||||
</a>
|
</a>
|
||||||
{{end}}
|
{{end}}
|
||||||
|
|
||||||
{{if and .EnableActions (.Permission.CanRead ctx.Consts.RepoUnitTypeActions)}}
|
{{if and .EnableActions (.Permission.CanRead ctx.Consts.RepoUnitTypeActions) (not .IsEmptyRepo)}}
|
||||||
<a class="{{if .PageIsActions}}active {{end}}item" href="{{.RepoLink}}/actions">
|
<a class="{{if .PageIsActions}}active {{end}}item" href="{{.RepoLink}}/actions">
|
||||||
{{svg "octicon-play"}} {{ctx.Locale.Tr "actions.actions"}}
|
{{svg "octicon-play"}} {{ctx.Locale.Tr "actions.actions"}}
|
||||||
{{if .Repository.NumOpenActionRuns}}
|
{{if .Repository.NumOpenActionRuns}}
|
||||||
|
Loading…
Reference in New Issue
Block a user