mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-31 07:21:36 +01: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,14 +65,12 @@ git push -u origin {{.Repository.DefaultBranch}}</code></pre> | |||||||
| 								</div> | 								</div> | ||||||
| 							</div> | 							</div> | ||||||
| 						{{end}} | 						{{end}} | ||||||
| 					{{else}} |  | ||||||
| 						<div class="ui segment center"> |  | ||||||
| 							{{ctx.Locale.Tr "repo.empty_message"}} |  | ||||||
| 					</div> | 					</div> | ||||||
|  | 				{{else}} | ||||||
|  | 					<div class="ui segment center">{{ctx.Locale.Tr "repo.empty_message"}}</div> | ||||||
| 				{{end}} | 				{{end}} | ||||||
| 			</div> | 			</div> | ||||||
| 		</div> | 		</div> | ||||||
| 	</div> | 	</div> | ||||||
| </div> | </div> | ||||||
| </div> |  | ||||||
| {{template "base/footer" .}} | {{template "base/footer" .}} | ||||||
|  | |||||||
| @ -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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user