summaryrefslogtreecommitdiffstats
path: root/modules/context/repo.go
diff options
context:
space:
mode:
authorzeripath <art27@cantab.net>2021-11-22 22:32:16 +0000
committerGitHub <noreply@github.com>2021-11-22 22:32:16 +0000
commit1dbc58f742febbe58df59d4ce4148d2dbec1a20f (patch)
tree4b73978cdcbdff2e88752d8bbfa21478856d4305 /modules/context/repo.go
parentbaed01f24753afb600a2984dcb9bcda0bb8502b6 (diff)
downloadgitea-1dbc58f742febbe58df59d4ce4148d2dbec1a20f.tar.gz
gitea-1dbc58f742febbe58df59d4ce4148d2dbec1a20f.zip
More pleasantly handle broken or missing git repositories (#17747)
* More pleasantly handle broken or missing git repositories In #17742 it was noted that there a completely invalid git repository underlying a repo on gitea.com. This happened due to a problem during a migration however, it is not beyond the realms of possibility that a corruption could occur to another user. This PR adds a check to RepoAssignment that will detect if a repository loading has failed due to an absent git repository. It will then show a page suggesting the user contacts the administrator or deletes the repository. Fix #17742 Signed-off-by: Andrew Thornton <art27@cantab.net> * Update options/locale/locale_en-US.ini Co-authored-by: techknowlogick <techknowlogick@gitea.io> Co-authored-by: techknowlogick <techknowlogick@gitea.io>
Diffstat (limited to 'modules/context/repo.go')
-rw-r--r--modules/context/repo.go34
1 files changed, 33 insertions, 1 deletions
diff --git a/modules/context/repo.go b/modules/context/repo.go
index c96d34f2fc..1f1a035267 100644
--- a/modules/context/repo.go
+++ b/modules/context/repo.go
@@ -522,14 +522,30 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
}
}
+ isHomeOrSettings := ctx.Link == ctx.Repo.RepoLink || ctx.Link == ctx.Repo.RepoLink+"/settings" || strings.HasPrefix(ctx.Link, ctx.Repo.RepoLink+"/settings/")
+
// Disable everything when the repo is being created
- if ctx.Repo.Repository.IsBeingCreated() {
+ if ctx.Repo.Repository.IsBeingCreated() || ctx.Repo.Repository.IsBroken() {
ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch
+ if !isHomeOrSettings {
+ ctx.Redirect(ctx.Repo.RepoLink)
+ }
return
}
gitRepo, err := git.OpenRepository(models.RepoPath(userName, repoName))
if err != nil {
+ if strings.Contains(err.Error(), "repository does not exist") || strings.Contains(err.Error(), "no such file or directory") {
+ log.Error("Repository %-v has a broken repository on the file system: %s Error: %v", ctx.Repo.Repository, ctx.Repo.Repository.RepoPath(), err)
+ ctx.Repo.Repository.Status = models.RepositoryBroken
+ ctx.Repo.Repository.IsEmpty = true
+ ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch
+ // Only allow access to base of repo or settings
+ if !isHomeOrSettings {
+ ctx.Redirect(ctx.Repo.RepoLink)
+ }
+ return
+ }
ctx.ServerError("RepoAssignment Invalid repo "+models.RepoPath(userName, repoName), err)
return
}
@@ -551,6 +567,17 @@ func RepoAssignment(ctx *Context) (cancel context.CancelFunc) {
tags, err := ctx.Repo.GitRepo.GetTags(0, 0)
if err != nil {
+ if strings.Contains(err.Error(), "fatal: not a git repository ") {
+ log.Error("Repository %-v has a broken repository on the file system: %s Error: %v", ctx.Repo.Repository, ctx.Repo.Repository.RepoPath(), err)
+ ctx.Repo.Repository.Status = models.RepositoryBroken
+ ctx.Repo.Repository.IsEmpty = true
+ ctx.Data["BranchName"] = ctx.Repo.Repository.DefaultBranch
+ // Only allow access to base of repo or settings
+ if !isHomeOrSettings {
+ ctx.Redirect(ctx.Repo.RepoLink)
+ }
+ return
+ }
ctx.ServerError("GetTags", err)
return
}
@@ -919,6 +946,11 @@ func UnitTypes() func(ctx *Context) {
// IssueTemplatesFromDefaultBranch checks for issue templates in the repo's default branch
func (ctx *Context) IssueTemplatesFromDefaultBranch() []api.IssueTemplate {
var issueTemplates []api.IssueTemplate
+
+ if ctx.Repo.Repository.IsEmpty {
+ return issueTemplates
+ }
+
if ctx.Repo.Commit == nil {
var err error
ctx.Repo.Commit, err = ctx.Repo.GitRepo.GetBranchCommit(ctx.Repo.Repository.DefaultBranch)