mirror of
				https://github.com/go-gitea/gitea.git
				synced 2025-10-29 10:57:44 +09:00 
			
		
		
		
	Deleting branch could delete broken branch which has database record but git branch is missing (#35360)
For some reasons, branches between database and git are not synced. If a branch exists in database but not in the git, it should be able to be deleted. --------- Co-authored-by: wxiaoguang <wxiaoguang@gmail.com>
This commit is contained in:
		| @@ -532,8 +532,8 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R | |||||||
| 	// database branch record not exist or it's a deleted branch | 	// database branch record not exist or it's a deleted branch | ||||||
| 	notExist := git_model.IsErrBranchNotExist(err) || rawBranch.IsDeleted | 	notExist := git_model.IsErrBranchNotExist(err) || rawBranch.IsDeleted | ||||||
|  |  | ||||||
| 	commit, err := gitRepo.GetBranchCommit(branchName) | 	branchCommit, err := gitRepo.GetBranchCommit(branchName) | ||||||
| 	if err != nil { | 	if err != nil && !errors.Is(err, util.ErrNotExist) { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -549,6 +549,9 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R | |||||||
| 				return fmt.Errorf("DeleteBranch: %v", err) | 				return fmt.Errorf("DeleteBranch: %v", err) | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
|  | 		if branchCommit == nil { | ||||||
|  | 			return nil | ||||||
|  | 		} | ||||||
|  |  | ||||||
| 		return gitRepo.DeleteBranch(branchName, git.DeleteBranchOptions{ | 		return gitRepo.DeleteBranch(branchName, git.DeleteBranchOptions{ | ||||||
| 			Force: true, | 			Force: true, | ||||||
| @@ -557,20 +560,24 @@ func DeleteBranch(ctx context.Context, doer *user_model.User, repo *repo_model.R | |||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName) | 	if branchCommit == nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	// Don't return error below this | 	// Don't return error below this | ||||||
|  |  | ||||||
|  | 	objectFormat := git.ObjectFormatFromName(repo.ObjectFormatName) | ||||||
| 	if err := PushUpdate( | 	if err := PushUpdate( | ||||||
| 		&repo_module.PushUpdateOptions{ | 		&repo_module.PushUpdateOptions{ | ||||||
| 			RefFullName:  git.RefNameFromBranch(branchName), | 			RefFullName:  git.RefNameFromBranch(branchName), | ||||||
| 			OldCommitID:  commit.ID.String(), | 			OldCommitID:  branchCommit.ID.String(), | ||||||
| 			NewCommitID:  objectFormat.EmptyObjectID().String(), | 			NewCommitID:  objectFormat.EmptyObjectID().String(), | ||||||
| 			PusherID:     doer.ID, | 			PusherID:     doer.ID, | ||||||
| 			PusherName:   doer.Name, | 			PusherName:   doer.Name, | ||||||
| 			RepoUserName: repo.OwnerName, | 			RepoUserName: repo.OwnerName, | ||||||
| 			RepoName:     repo.Name, | 			RepoName:     repo.Name, | ||||||
| 		}); err != nil { | 		}); err != nil { | ||||||
| 		log.Error("Update: %v", err) | 		log.Error("PushUpdateOptions: %v", err) | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	return nil | 	return nil | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user